Spring

Spring Security 접근 불가 페이지 만들기

waVwe 2024. 8. 17. 13:42
728x90
반응형

 

 

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

 

 

회원 상세정보(UserDetailsImpl) 를 통해 권한 설정 가능. 권한을 1개 이상 설정 가능.

"권한 이름" 규칙 : "ROLE_"로 시작해야 함.

예) "ADMIN" 권한 부여 → "ROLE_ADMIN" "USER" 권한 부여 → "ROLE_USER"

 

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;
    }
}

 

예시 코드는 ROLE_ADMIN 으로 고정되어 있지만 아래와 같이 실제 코드에서는 사용자에 저장되어 있는 role의 authority 값을 사용하여 동적으로 저장된다.

 

UserRoleEnum role = user.getRole();
String authority = role.getAuthority();

SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);

 

UserDetailsImpl에 저장된 authorities 값을 사용하여 간편하게 권한을 제어 할 수 있다.

 

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

 

Controller에 @Secured 에너테이션으로 권한 설정 가능.

@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 에너테이션 활성화 방법

@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화
public class WebSecurityConfig {

 

접근 불가 페이지 URL 설정

WebSecurityConfig

// 접근 불가 페이지
http.exceptionHandling((exceptionHandling) ->
        exceptionHandling
                // "접근 불가" 페이지 URL 설정
                .accessDeniedPage("/forbidden.html")
);

 

728x90
반응형