티스토리 뷰

Spring에서는 인증 및 인가의 기능을 제공해주는 JAVA EE 프레임워크인 Spring Security를 제공한다.
이 프레임워크를 이용하게되면 여러사용자에대해 특정 요청에 대해 접근제한을 둘수가 있는데 Security에서는 이러한 부분을 동적으로 처리할 수 있는 기능을 제공하는데 예제코드와 함께 살펴보자.

Security 설정중 일부

해당설정은 /study/list라는 요청은 ADMIN, USER의 권한을 가진 사용자만, /study/regist는 ADMIN 권한을 가진사용자만 요청할 수 있게 설정되있다.

 

고객의 요구사항중에 사용자별로 메뉴에 대해 권한을 제어할 수 있는 기능을 만들어 달라고 할때가 있다.

예를들어 USER의 권한을 가진 사용자를 ADMIN 권한으로 변경을 하게되면 이 사용자는 두 요청 모두 정상적으로
접근이 되어야 한다.

위와 같이 정적으로 설정이 잡혀있기에 고객의 요구사항을 개발하는데엔 문제가 있다. 이 문제를 해결하기 위해
사용자의 권한을 동적으로 제어할 수 있도록 해보자.

AuthorizationDynamicHandler 생성

Spring Bean을 생성하여 그 Bean에서 직접제어를 할 수 있게끔 기능을 제공한다.

여기서 주의할점은 메서드 매개변수의 이름이 같고 매개변수 위치도 같아야한다.

표현식 : @Bean이름.메소드명(매개변수명...)

테스트

테스트를 돌려보니 /study/regist 요청이 들어올때 AuthorizationDynamicHandler의 로직이 수행되었음을 알 수있다.
true가 리턴되면 정상적으로 접근이 되지만 false가 리턴되면 403 에러가 발생되는데 그때는

AuthenticationEntryPoint 인터페이스의 확장클래스를 만들어서 별도로 처리할 수 있다.

 

예제코드에서는 SecurityContextHolder에 저장된 인증된 사용자의 정보를 꺼낸뒤 권한을 체크했지만
실질적으로는 DB에서 권한별 메뉴테이블을 조회해와서 해당 권한이 메뉴에 접근이 가능한지에 대한 여부를 체크해야한다.

 

이방식의 단점은 아무래도 요청시 매번 DB를 조회해야한다는 번거로움이 있지만 필자가 수행했던 프로젝트에서는
메뉴가 그렇게 많지도 않았기에 성능상에 큰 이슈는 발생되진 않았다.

 

참고문서
https://docs.spring.io/spring-security/site/docs/5.1.0.RELEASE/reference/htmlsingle/#el-access-web-beans

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함