인프런 커뮤니티 질문&답변

ckdtjd1272님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

프로그래밍 방식의 인가 구현 – DB 연동

15섹션 프로그래밍 방식의 인가 구현 – DB 연동 / 여러개의 권한매핑

작성

·

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());
    }
ckdtjd1272님의 프로필 이미지
ckdtjd1272
질문자

빠른 답변 감사합니다.

키값에 변형을 주는것이 아닌 value 값을 각각의 권한이 아닌 url에 매핑되어있는 권한의 Set구조를 넣어

return을 Map<String,Set>으로 하여 매니저 단에서 forEach를 돌려서 해보겠습니다.

 

감사합니다~!!