ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시큐리티 권한처리
    스프링/스프링 시큐리티 2024. 1. 8. 20:51

    이전에 SecurityConfig에서 /manager 경로는 ADMIN, MANAGER만 접근이 가능하게 했다. 또한, /admin 경로는 ADMIN만 접근이 가능하게 했었다.

     

    Role을 저렇게 부여하면 스프링 시큐리티에서 자동으로 ROLE_ADMIN, ROLE_MANAGER 등으로 바꿔준다.

     

    따라서 우리가 설정할 때에도 권한 값에 위와 같이 넣어줘야 한다.

    (ROLE_MANAGER가 아니라 MANAGER라고만 해서 접근이 안되어서 엄청 헤맸다...)

     

     

    간편하게 권한을 부여하는 방법이 또 있다.

    @Configuration
    @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록이 된다.
    @EnableGlobalMethodSecurity(securedEnabled = true)
    public class SecurityConfig {
    
    }

    SecurityConfig에 @EnableGlobalMethodSecurity(securedEnable = true)라는 어노테이션을 추가해준다.

     

    @Controller
    public class IndexController {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private BCryptPasswordEncoder bCryptPasswordEncoder;
        
        @Secured("ROLE_ADMIN")
        @GetMapping("/info")
        public @ResponseBody String info() {
            return "개인정보";
        }
    }

    API 앞에 @Secured 어노테이션을 붙여주면 해당 권한을 가진 사람만 접근할 수 있다.

    위에서는 @Secured("ROLE_ADMIN")으로 Role이 ROLE_ADMIN인 사람만 페이지에 접근이 가능하도록 했다.

     

    여기서는 ADMIN이 아니라 ROLE_ADMIN으로 넣어줘야 한다.

     

     

    특정한 하나에만 권한을 부여할 때 @Secured를 사용하면 좋고, 아니라면 위에처럼 SecurityConfig에서 필터를 해주는 것이 좋다.

     

     

    @Controller
    public class IndexController {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private BCryptPasswordEncoder bCryptPasswordEncoder;
    
        @PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
        // 2개의 권한을 한번에 걸 때 유용하다.
        @GetMapping("/data")
        public @ResponseBody String data() {
            return "데이터정보";
        }
    }

    다른 방법으로 @PreAuthroize 어노테이션이 있다. 2개의 권한을 한 번에 걸 때 유용하지만 많이 쓰이지는 않는다고 한다.

Designed by Tistory.