본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


Spring Security

스프링시큐리티 공부 6 - RoleHierarchy, authenticationDetailsSource 설정하기

반응형

1. RoleHierarchy 

 

롤에 계층을 줄 수 있도록 해주는 클래스이다 빈으로 등록하면 유저의 role에 따라 지정해놓은 계층 구도가 적용된다 

코드로 알아보자 

 

 

부등호로 롤의 계층을 표현할 수있다 

 

예를 들어 ROLE_A > ROLE_B > ROLE_C 로 설정해두면 ROLE_A는 B,C의 모든 권한을 갖을 수 있다 . 

 

 

사용해 보자 스프링 시큐리티 config 파일에 정의해 두었다 .

 

RoleHierachy는 인터페이스고 RoleHierachyImpl 은 구현체이다 .  RoleHierachyImpl을 생성해서 Hierarchy를 등록해 주고 리턴한다.  해당 메서드를 빈으로 등록해 두면 스프링이 인식하여 다른 설정없이 동작한다 . 

 

 

2.authenticationDetailsSource 셋팅하기 

 

authenticationDetailsSource은 authentication 에서 details에 대한 정보를 커스터 마이징하여 셋팅할 때 사용한다. 

기본적으로 details에 들어가는 값은 아래 그림의 "detals"와 같다.

 

details에 필요한 값들을 추가하여 커스터마이징 해보자.

 

details에는 주로 request에 대한 정보들이 들어간다 먼저 

 

요청 주소 IP , sessionId , login한 시간 , 요청 uri를 갖는 RequestInfo라는 Dto를 만들었다.

 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RequestInfo {

    private String remoteIp;
    private String sessionId;
    private LocalDateTime loginTime;
    private String requestUri;
}

 

 

 

authenticationDetailsSorce 메서드의 파라미터를 보면 AuthenticationDetailsSource 를 제공해 줘야한다. 

 

 

 

CustomAuthDetails는 AuthenticationDetailsSource를 구현하는 클래스이다 ,

AuthenticationDetailsSource는 제네릭타입으로 HttpServletRequest 와 Details를 담을 Dto의 타입이 필요하다 ,

@Component
public class CustomAuthDetails implements AuthenticationDetailsSource<HttpServletRequest , RequestInfo> {
    @Override
    public RequestInfo buildDetails(HttpServletRequest request) {
        return RequestInfo.builder()
                .remoteIp(request.getRemoteAddr())
                .sessionId(request.getSession().getId())
                .loginTime(LocalDateTime.now())
                .requestUri(request.getRequestURI())
                .build();
    }
}

 

implementsMethod를 하면 bulidDetails 메서드를 통해 해당 HttpServletRequest 객체에서 request 정보를 뺴와  Dto에 바인딩해 생성하게 된다 . SecurityConfig 내에서 사용해야 하기 떄문에 @Component로 컴포넌트로 만들고 

 

  SecurityConfig에서 사용해보자  

 

 

 

생성자 주입을 통해 만들어놓은 customAuthDetails(Details 정보)를 주입받았다 .

 

아래와 같이 authenticationDetailsSource의 파라미터로 customAuthDetails를 넘겨줬다 . 

 

 

브라우져에서 다시 요청해보자

 

직접 정의한 details 대로 데이터가 들어 갔다. 

 

직접 데이터를 정의할 일이 있을 수 있으니 알아두자 . 언제일까 .

반응형