API(Controller) 권한 설정
다음은 API 권한 설정에 대한 설명입니다.
API 권한 설정 시 Security Config 설정과 Controller에서 API 작성 권한 설정, 특정 역할이 설정된 권한 API 호출 방법에 대해 설명합니다.
Security Config 설정
프로젝트
SecurityConfig 내용
x2bee-bo
- Constants.getGuestUris()에 설정된 URI의 경우 permitAll() 설정으로 전체 허용 - 로그인 페이지, 오류 페이지, 샘플페이지 등 - GuestUris를 제외한 모든 API는 authorize.anyRequest().authenticated() 설정으로 스프링 시큐리티 인증 필요 - BO에서 관리자 로그인을 성공할 경우 ROLE_ADMIN 권한을 가지게 됨
x2bee-api-bo
- 모든 API는 authorize.anyRequest().hasAnyRole("SERVICE", "ADMIN") 설정으로 스프링 시큐리티 인증이 필요하며 ROLE_SERVICE, ROLE_ADMIN의 역할이 있어야 인가됨
x2bee-api-업무
- BO를 제외한 모든 API 프로젝트들은 @EnableMethodSecurity(securedEnabled = true, jsr250Enabled = true) 해당 옵션이 설정되어서 중앙의 securityFilterChain에서 관리하지 않고 개별 Controller Method에 Security 설정을 추가함 - FO, MO 쪽에서 API-MEMBER를 통해 로그인을 성공할 경우 ROLE_MEMBER 권한을 가지게 됨
Controller에서 API 작성시 권한 설정
※ 해당 내용은 'api-{업무}'에서만 활용되며, api-bo의 경우에는 중앙의 securityFilterChain에서 모든 API에 대하여 ROLE_SERVICE 및 ROLE_ADMIN 역할만 인가되도록 설정되어 있습니다.
권한
내용
권한없음
@GetMapping("/search4") public Response searchSamples4() { return Response.builder().payload("ROLE_NONE").build(); }
모든 호출이 인가됨.
ROLE_SERVICE 역할 인가 허용
@Secured("ROLE_SERVICE") @GetMapping("/search1") public Response searchSamples1() { return Response.builder().payload("ROLE_SERVICE").build(); }
ROLE_SERVICE 역할을 가진 인증자만 인가됨.
ROLE_MEMBER 역할 인가 허용
@Secured("ROLE_MEMBER") @GetMapping("/search2") public Response searchSamples2() { return Response.builder().payload("ROLE_MEMBER").build(); }
ROLE_MEMBER 역할을 가진 인증자만 인가됨.
ROLE_SERVICE, ROLE_MEMBER 역할 인가 허용
@PreAuthorize("hasRole('ROLE_SERVICE') or hasRole('ROLE_MEMBER')") @GetMapping("/search3") public Response searchSamples3() { return Response.builder().payload("ROLE_SERVICE, ROLE_MEMBER").build(); }
ROLE_SERVICE 또는 ROLE_MEMBER 역할을 가진 인증자만 인가됨.
특정 역할이 설정된 권한 API 호출 방법
권한
함수
내용
ROLE_SERVICE
- RestApiUtil.get - RestApiUtil.post - RestApiUtil.put - RestApiUtil.patch - RestApiUtil.delete
-> Secured가 붙지 않은 일반 호출 함수로 API를 실행할 경우 내부적으로 ROLE_SERVICE 역할을 가진 JWT 토큰을 생성하여 Authorization 헤더에 토큰을 저장하여 전달함. 전달받는 API의 Token Filter 클래스에서는 해당 JWT 토큰값을 확인하여 ROLE_SERVICE 역할을 가진 Security 인증을 생성하여 ROLE_SERVICE가 붙은 API를 인가시킴.
ROLE_MEMBER
- RestApiUtil.getSecured - RestApiUtil.postSecured - RestApiUtil.putSecured - RestApiUtil.patchSecured - RestApiUtil.deleteSecured
> Secured가 붙은 호출 함수로 API를 실행할 경우 내부적으로 Security 인증 객체를 체크하여 해당 객체에서 mbrNo 값을 가져와 해당 값과 ROLE_MEMBER 역할을 가진 JWT 토큰을 생성하여 Authorization 헤더에 토큰을 저장하여 전달함. 전달받는 API의 Token Filter 클래스에서는 해당 JWT 토큰값을 확인하여 해당 mbrNo값으로 실제 인증된 사용자인지 체크함. 인증된 사용자일 경우 해당 조회한 사용자 객체로 ROLE_MEMBER 역할을 가진 Security 인증을 생성하여 ROLE_MEMBER가 붙은 API를 인가시킴.
주의사항 → Secured 함수를 호출할 경우 로그인이 되어 있지 않다면 Security 인증 객체에서 mbrNo 값을 가져올 수 없어 권한 오류가 발생합니다. 해당 함수를 사용하여 호출할 경우에는 호출하는 쪽에서 로그인이 되어 있어야 합니다.
마지막 업데이트