복붙노트

[SPRING] PreAuthorize가 컨트롤러에서 작동하지 않습니다.

SPRING

PreAuthorize가 컨트롤러에서 작동하지 않습니다.

메서드 수준에서 액세스 규칙을 정의하려고하는데 그게 그렇게 작동하지 않습니다.

보안 설정

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().
                withUser("user").password("user").roles("USER").and().
                withUser("admin").password("admin").roles("ADMIN");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/v2/**").authenticated()
                .and()
                .httpBasic()
                .realmName("Secure api")
                .and()
                .csrf()
                .disable();
    }
}

ExampleController

@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    String home() {
        return "Hello World";
    }
}

사용자 : user를 사용하여 / v2 / home에 액세스하려고 할 때마다 올바르게 실행됩니다. ROLE_ADMIN이없는 'user'로 인해 액세스 거부 오류가 발생하지 않아야합니까?

나는 실제로 메소드 레벨에서 액세스 규칙을 버리고 http () 개미 규칙을 고수하려고 생각하고 있지만, 왜 그것이 나를 위해 작동하지 않는지를 알아야한다.

해결법

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

    1.컨트롤러에서 PrePost 어노테이션을 사용할 때의 공통적 인 문제점은 Spring 메소드 보안이 Spring AOP를 기반으로한다는 점이다. Spring AOP는 기본적으로 JDK 프록시로 구현된다.

    컨트롤러에서 PrePost 어노테이션을 사용할 때의 공통적 인 문제점은 Spring 메소드 보안이 Spring AOP를 기반으로한다는 점이다. Spring AOP는 기본적으로 JDK 프록시로 구현된다.

    즉, 컨트롤러 레이어에 인터페이스로 주입되는 서비스 레이어에서는 제대로 작동하지만 컨트롤러는 일반적으로 인터페이스를 구현하지 않으므로 컨트롤러 레이어에서는 무시됩니다.

    다음은 제 의견입니다.

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

    2.WebSecurityConfig에 @EnableGlobalMethodSecurity (prePostEnabled = true)를 추가해야합니다.

    WebSecurityConfig에 @EnableGlobalMethodSecurity (prePostEnabled = true)를 추가해야합니다.

    여기에서 찾을 수 있습니다. http://www.baeldung.com/spring-security-expressions-basic

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
  3. ==============================

    3.비슷한 문제가 있었는데 다음과 같이 해결했습니다.

    비슷한 문제가 있었는데 다음과 같이 해결했습니다.

    1) 내 방법을 공개 (즉, 방법 가정 () 공개)

    2) hasAuthority 대신 hasRole을 사용해야합니다.

  4. ==============================

    4.컨트롤러 레이어에서 작업하기 위해서. 구성 클래스에 @EnableAspectJAutoProxy를 추가해야했습니다. 예 :

    컨트롤러 레이어에서 작업하기 위해서. 구성 클래스에 @EnableAspectJAutoProxy를 추가해야했습니다. 예 :

    @Configuration
    @EnableWebMvc
    @EnableAspectJAutoProxy
    @ComponentScan(basePackages = { "com.abc.fraud.ts.userservices.web.controller" })
    public class WebConfig extends WebMvcConfigurerAdapter{
    
    }
    
  5. ==============================

    5.이것을 사용하는 두 가지 다른 방법이 있습니다. 하나는 접두어이고 다른 하나는 접두사가 아닙니다. 그리고 아마도 @PreAuthorize ( "hasAuthority ( 'ROLE_ADMIN')")를 @PreAuthorize ( "hasAuthority ( 'ADMIN')"로 바꿀 수 있습니다.

    이것을 사용하는 두 가지 다른 방법이 있습니다. 하나는 접두어이고 다른 하나는 접두사가 아닙니다. 그리고 아마도 @PreAuthorize ( "hasAuthority ( 'ROLE_ADMIN')")를 @PreAuthorize ( "hasAuthority ( 'ADMIN')"로 바꿀 수 있습니다.

    다음은 @PreAuthorize 소스 코드입니다.

    private String defaultRolePrefix = "ROLE_";
    public final boolean hasAuthority(String authority) {
        return hasAnyAuthority(authority);
    }
    
    public final boolean hasAnyAuthority(String... authorities) {
        return hasAnyAuthorityName(null, authorities);
    }
    
    public final boolean hasRole(String role) {
        return hasAnyRole(role);
    }
    
    public final boolean hasAnyRole(String... roles) {
        return hasAnyAuthorityName(defaultRolePrefix, roles);
    }
    
  6. ==============================

    6.보안 bean에 대한 xml 컨텍스트 파일과 웹 / servlet 컨텍스트에 대한 별도의 xml 컨텍스트가있는 경우 다음을 추가해야합니다.

    보안 bean에 대한 xml 컨텍스트 파일과 웹 / servlet 컨텍스트에 대한 별도의 xml 컨텍스트가있는 경우 다음을 추가해야합니다.

    <security:global-method-security pre-post-annotations="enabled"/>
    

    web-context.xml / 서블릿 컨텍스트에 추가하십시오. 단순히 보안 컨텍스트 xml에이를 추가하는 것만으로는 충분하지 않습니다.

    자식 컨텍스트에서는 상속되지 않습니다.

    HTH

  7. from https://stackoverflow.com/questions/32442408/preauthorize-not-working-on-controller by cc-by-sa and MIT license