【问题标题】:Security config when using @PreAuthorize使用@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 确定?
【问题讨论】:
标签:
java
spring
spring-mvc
spring-security
【解决方案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 的请求映射,每个人都将被授予访问权限。