복붙노트

[SPRING] 경로 변수를 기반으로하는 스프링 보안 권한

SPRING

경로 변수를 기반으로하는 스프링 보안 권한

내 유스 케이스는 @PathVariable 매개 변수를 기반으로 사용자를 인증하고 권한을 부여하는 것입니다. 보안 주체를 인증하려면 일부 사용자 지정 코드를 실행해야합니다. 여기에 접근하는 방법을 잘 모르겠습니다.

어떤 접근 방식이 바람직합니까, 아니면 이것을 깨끗하게하는 다른 방법이 있습니까?

해결법

  1. ==============================

    1.해결책이 있습니다. 구성 클래스에서

    해결책이 있습니다. 구성 클래스에서

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter
    

    나는 방법을 가질 수 있었다

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/student/{id}/**")
                .access("@guard.checkUserId(authentication,#id)");
    }
    

    SpEL의 @guard는

    @Component
    public class Guard {
        @Autowired
        private UserRepository repo;
    
        public boolean checkUserId(Authentication authentication, int id) {
            String name = authentication.getName();
            System.out.println(name+" at "+id);
            User result = repo.findByUsername(name);
            return result != null && result.getPid() == id;
        }
    }
    

    실제로 SpEL의 #id는 이전 행의 {id}에서 추출 된 값을 가져올 수 있습니다. checkUserId에서 원하는 모든 작업을 수행 할 수 있으며 리턴 값은 경로에 대한 액세스 허용 여부를 결정합니다.

  2. ==============================

    2.내가 이것을 상상할 수있는 방법은 매개 변수에서 경로 변수를 캡처하고 메소드 레벨 권한 부여를 사용 한 다음 hasPermission을 사용하는 것입니다. 이 답변에는 도움이 될 경우를 대비하여 정확하게 수행하는 방법에 대한 세부 정보가 있습니다.

    내가 이것을 상상할 수있는 방법은 매개 변수에서 경로 변수를 캡처하고 메소드 레벨 권한 부여를 사용 한 다음 hasPermission을 사용하는 것입니다. 이 답변에는 도움이 될 경우를 대비하여 정확하게 수행하는 방법에 대한 세부 정보가 있습니다.

  3. from https://stackoverflow.com/questions/33115446/authorization-in-spring-security-based-on-path-variables by cc-by-sa and MIT license