[SPRING] 17 : Spring Security 3

김승수·2024년 6월 17일
0

SPRING

목록 보기
17/27

⏰ 2024. 06. 17 월

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. Spring Security에서 권한 설정 방법
  2. Spring Security를 이용한 API별 권한 제어 방법

접근 불가 페이지 만들기 - API 접근 권한 제어 이해

Spring Security에서 권한(Authority) 설정 방법

  1. 회원 상세정보(UserDetailsImpl)을 통해 권한(Authority) 설정 할 수 있다.
  2. 권한은 1개 이상 설정할 수 있다.
  3. 권한 이름 규칙
    • ROLE_로 시작해야 한다.
    • ADMIN 권한 부여 = ROLE_ADMIN
    • USER 권한 부여 = ROLE_USE
public enum UserRoleEnum {
     USER(Authority.USER),  // 사용자 권한
     ADMIN(Authority.ADMIN);  // 관리자 권한

     private final String authority;

     UserRoleEnum(String authority) {
         this.authority = authority;
     }

     public String getAuthority() {
         return this.authority;
     }

     public static class Authority {
         public static final String USER = "ROLE_USER";
         public static final String ADMIN = "ROLE_ADMIN";
     }
 }
 public class UserDetailsImpl implements UserDetails {
 		// ...

 	@Override
     public Collection<? extends GrantedAuthority> getAuthorities() {
         SimpleGrantedAuthority adminAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
         Collection<GrantedAuthority> authorities = new ArrayList<>();
         authorities.add(adminAuthority);

         return authorities;
     }
 }
  • new SimpleGrantedAuthority("ROLE_ADMIN")을 보면 위 예시 코드는 권한이 ROLE_ADMIN으로 고정되어 있지만, 실제 코드에서는 사용자에 정의되어 있는 role의 authority 값을 사용하여 동적으로 저장된다.
  UserRoleEnum role = user.getRole();
  String authority = role.getAuthority();

  SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
  • UserDetailsImple에 저장된 authority 값을 사용하여 간편하게 권한을 제어할 수 있다.

Spring Security를 이용한 API별 권한(Authority) 제어 방법

  • Controller에서 @Secured 애너테이션으로 권한 설정이 가능하다.
  • @Secured("권한 이름") 선언하고, 권한을 1개 이상 설정 가능하다.
@Secured(UserRoleEnum.Authority.ADMIN) // 관리자용
@GetMapping("/products/secured")
public String getProductsByAdmin(@AuthenticationPrincipal UserDetailsImpl userDetails) {

	System.out.println("userDetails.getUsername() = " + userDetails.getUsername());
    
	for (GrantedAuthority authority : userDetails.getAuthorities()) {
		System.out.println("authority.getAuthority() = " + authority.getAuthority());
	}

	return "redirect:/";
}
  • @Secured 애너테이션 활성화 방법

  • SecurityConfig 클래스에 @EnableGlobalMethodSecurity(securedEnabled = true) 을 설정하여 활성화 할 수 있다.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화
public class WebSecurityConfig {
	...
}
profile
개발하는 미어캣

0개의 댓글