使用@PreAuthorize 时的安全配置

Posted

技术标签:

【中文标题】使用@PreAuthorize 时的安全配置【英文标题】:Security config when using @PreAuthorize 【发布时间】:2014-12-07 09:39:44 【问题描述】:

我的安全配置类(继承自 WebSecurityConfigurerAdapter)有如下方法。

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
            .antMatchers("/restaurant/**").access("hasRole('ROLE_USER')")
            .and()
        .formLogin();

但是我宁愿在我的控制器上使用@PreAuthorize。如果我删除该方法,一切都需要身份验证。我的方法应该是什么样子,这样一切都可用并且访问权限仅由 PreAuthorize 确定?

【问题讨论】:

【参考方案1】:

如前所述,使用方法级别的安全性来保护控制器方法并不是很常见,而是使用业务逻辑来保护方法。即使您需要根据请求属性执行授权,也应该可以使用基于 URL 的安全性和 Web 安全性表达式来实现。

可用表达式由WebSecurityExpressionRoot 类定义,其实例在评估Web 访问表达式时用作表达式根对象。该对象还直接暴露了名为request 下的HttpServletRequest 对象,因此您可以直接在表达式中调用请求。

Here 您可以找到有关何时使用基于 URL 的安全性以及何时使用方法级安全性的更多详细信息。

【讨论】:

【参考方案2】:

在控制器方法上使用@PreAuthorize 相当少见,但如果决定取决于请求参数,我可能会有用例......

如果您不想在请求级别进行任何授权,您可以简单地:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.formLogin();

您只声明一个表单登录,并没有请求安全性。但不要忘记请求安全性比方法安全性使用更少的资源。

【讨论】:

【参考方案3】:

试试.access("permitAll"),而不是.access("hasRole('ROLE_USER')")。请注意,对于没有 @PreAuthorize 的请求映射,每个人都将被授予访问权限。

【讨论】:

以上是关于使用@PreAuthorize 时的安全配置的主要内容,如果未能解决你的问题,请参考以下文章

JpaRepository 上的@PreAuthorize

@PreAuthorize 不适用于 oauth2 外部服务器

Spring Security SAML 扩展和@PreAuthorize

如何在 Spring Boot 应用程序中禁用/忽略 @PreAuthorize

使用 mongodb PostAuthorize 和 PreAuthorize 的 Spring Boot 安全性不起作用

spring boot(1.3)基于oauth2资源服务器:不能使用@PreAuthorize方法安全