스프링 시큐리티 설정을 이용해 '관리자'만 접속 가능한 페이지를 설정해 봅시다.

일반 사용자는 접근 불가!!

 

1. 스프링 시큐리티가 로그인한 회원의 권한을 인식하도록 수정

UserDetailsImpl 클래스에 추가

    // 스프링 시큐리티는 ROLE_USER/ ROLE_ADMIN의 형식으로 보내주어야 인식가능
    private static final String ROLE_PREFIX = "ROLE_";

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRole userRole = user.getRole(); // 데이터베이스에서 조회해온 user의 role 조회

        SimpleGrantedAuthority authority = new SimpleGrantedAuthority(ROLE_PREFIX + userRole.toString());
        Collection<GrantedAuthority> authorities = new ArrayList<>(); // 여러개의 권한을 가진 사용자가 있을 수 있으므로 List로 만들어서 보낸다.
        authorities.add(authority);

        return authorities;
    }

 

 

2. WebSecurityConfig 파일 수정

"@EnableGlobalMethodSecurity(securedEnabled = true)" 추가 -> api마다 접근 가능한 role을 설정하기 위함.

http.authorizeRequests()에 아래 코드 추가 
//인가되지 않은 사용자 접근시 접근 금지 페이지로 이동

.and()
.exceptionHandling()
.accessDeniedPage("/user/forbidden");

 

 

3. 컨트롤러에서 인가가 필요한 API 에 @Secured 어노테이션과 "ROLE 이름" 추가

-> 관리자 role을 가진 사용자만 접근할 수 있도록 처리. (HomeController와 ProductCotroller의 관리자 기능에 추가함)

@Secured("ROLE_ADMIN")

 

4. forbidden 페이지를 위한 UserController 설정

@GetMapping("/user/forbidden")
public String forbidden() {
	return "forbidden";
}

 

 

 

이제 해당 API ("GET /admin, GET /api/admin/products") 접근 시, 스프링 시큐리티가 로그인 시도하는 회원이 관리자 역할을 가지고 있는지 인가합니다. 만약 관리자 권한을 가지고 있지 않은 회원의 요청이라면, 스프링 시큐리티 설정에 따라 접근 금지 페이지를 내려줍니다.

 

서버에서는 접근 권한에 대한 응답을 "HTTP Status Code 403 (Forbidden)"으로 정의해두고 사용합니다

권한 없는 사용자 접근시 아래처럼 이미지처럼 처리됨.

 

+ Recent posts