使用@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 时的安全配置的主要内容,如果未能解决你的问题,请参考以下文章
@PreAuthorize 不适用于 oauth2 外部服务器
Spring Security SAML 扩展和@PreAuthorize
如何在 Spring Boot 应用程序中禁用/忽略 @PreAuthorize
使用 mongodb PostAuthorize 和 PreAuthorize 的 Spring Boot 安全性不起作用