작성
·
269
·
수정됨
1
섹션 15 (프로그래밍 방식의 인가 구현 – DB 연동) 강의에서 6:10 에 작성하신 코드
위 코드에 대해서 질문 드립니다.
저는 PageDto라는 객체를 만들고
해당 객체는 String url, Set<PageRole>으로 구성되어있고
위와 같이 코드를 작성하였습니다.
데이터를 Map에 넣고 콘솔창에 출력해보았을 때
url값이 중복이라(맵의 key값) 마지막 권한만이 Map<String, String>객체에 들어가는데 하나의 url에 여러 개의 권한을 매핑 할 때 해당 구조로 작성 하는 것이 맞는지 질문 드립니다.
만약에 Map<String, Set>구조이면 이후 커스텀 매니저에서 setMapping()의 로직이 달라지는지도 궁금합니다.
답변 1
1
아 네
Map 의 특성상 키 중복이 일어날 수 있습니다.
일단 아래와 같이 할 수 있습니다. 물론 이 방식 외에 다른 방식으로도 가능합니다.
PersistentUrlRoleMapper.java
@Override
public Map<String, String> getUrlRoleMappings() {
List<Resources> resourcesList = resourcesRepository.findAllResources();
resourcesList.forEach(re -> {
re.getRoleSet().forEach(role -> { // 키를 중복되지 않도록 설정
urlRoleMappings.put(re.getId() + "|" + re.getResourceName(), role.getRoleName());
});
});
return urlRoleMappings;
}
CustomDynamicAuthorizationManager.java
@PostConstruct
public void mapping() {
DynamicAuthorizationService dynamicAuthorizationService =
new DynamicAuthorizationService(new PersistentUrlRoleMapper(resourcesRepository));
mappings = dynamicAuthorizationService.getUrlRoleMappings()
.entrySet().stream()
.map(entry -> {
// 키 값으로부터 url 값만 추출해서 설정
String url = entry.getKey().substring(entry.getKey().indexOf("|")+1);
RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry
= new RequestMatcherEntry<>(
new MvcRequestMatcher(handlerMappingIntrospector, url),
customAuthorizationManager(entry.getValue()));
return requestMatcherEntry;
})
.collect(Collectors.toList());
}
빠른 답변 감사합니다.
키값에 변형을 주는것이 아닌 value 값을 각각의 권한이 아닌 url에 매핑되어있는 권한의 Set구조를 넣어
return을 Map<String,Set>으로 하여 매니저 단에서 forEach를 돌려서 해보겠습니다.
감사합니다~!!