其他分享
首页 > 其他分享> > spring – PreAuthorize不在Controller上工作

spring – PreAuthorize不在Controller上工作

作者:互联网

我正在尝试在方法级别定义访问规则,但它无法正常工作.

SecurityConfiguration

@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:user访问/ v2 / home时它执行得很好,不应该因为’用户’没有ROLE_ADMIN而给我一个Access Denied错误?

我实际上是在考虑在方法级别放弃访问规则并坚持使用http()ant规则,但我必须知道它为什么不适合我.

解决方法:

在控制器上使用PrePost注释的一个常见问题是Spring方法安全性基于Spring AOP,默认情况下使用JDK代理实现.

这意味着它在服务层上工作正常,服务层作为接口注入控制器层,但在控制器层上被忽略,因为控制器通常不实现接口.

以下是我的意见:

>首选方式:在服务层上移动帖子前注释
>如果您不能(或不想),请尝试让您的控制器实现包含所有带注释方法的接口
>作为最后一种方法,使用proxy-target-class = true

标签:spring-java-config,spring,spring-boot,spring-security
来源: https://codeday.me/bug/20190926/1822296.html