当前位置: 首页 > 面试题库 >

预授权在控制器上不起作用

鄢选
2023-03-14
问题内容

正在尝试在方法级别定义访问规则,但是它从未如此有效。

安全配置

@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?

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


问题答案:

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

这意味着它在作为接口注入到控制器层中的服务层上可以正常工作,但是在控制器层上它会被忽略,因为控制器通常不实现接口。

以下是我的看法:

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


 类似资料:
  • EDIT做了一些更多的测试:当我只配置secure-annotations=“enabled”时,基于角色的安全性工作。此外,配置pre-postannotations=“enabled”时,既不安全也不预授权。当我只配置前-后注释时,它仍然不起作用。 编辑2 更多的测试:只有secured_annotations=“enabled”,对channelservice的调用通过Cglib2AopPr

  • MyControllerTest.java ApplicationContext-test.xml MyController.java

  • 我有以下几点。 我还尝试了一系列其他的排列,似乎都不起作用。我已经检查了这部分代码是否被执行,它执行并没有错误。 编辑 忘了提一下,所有的url都不能被经过身份验证的用户访问。但是任何经过身份验证的用户都可以访问所有URL。例如,以登录,我可以点击和,这是不应该发生的。 我没有东西可以尝试了。Emm...我已经用完了。我应该检查什么?

  • 我发现了许多类似的问题,但没有一个解决了我的问题。我的问题是可以访问的函数 下面是我的spring-security.xml代码。

  • 我已经创建了单独的spring boot oAuth2单独的服务器,并通过使用下面的配置在单独的REST API项目中使用secure。除了这个标签@preauthorize(“hasauthority('user')”)之外,一切都很好。它不起作用 YML配置:安全性:oauth2:resource:token-info-uri:http://127.0.0.1:9191/oauth/check

  • 我正在使用带Spring security的Thymeleaf模板引擎。为了使用sec:authorize功能,我还使用了Thymeleaf-Spring Security集成模块,但由于某些原因,它不起作用。我没有收到任何错误,但是html div块中的所有代码都会被执行,无论用户扮演哪个角色。 例如,当我以员工身份登录时,我也会看到“去领导”和“去系统”按钮,但我不想让员工看到这些按钮。 这是