我的安全配置类(继承自WebSecurityConfigurerAdapter)具有如下方法。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/restaurant/**").access("hasRole('ROLE_USER')")
.and()
.formLogin();
}
但我宁愿在我的控制器上使用@PreAuthorize。如果我删除该方法,一切都需要auth。我的方法应该是什么样子,所以一切都可用,访问权限只能由PreAuthorize确定?
答案 0 :(得分:0)
而不是.access("hasRole('ROLE_USER')")
,请尝试.access("permitAll")
。请注意,对于没有@PreAuthorize
的请求映射,每个人都将获得访问权限。
答案 1 :(得分:0)
在控制器方法上使用@PreAuthorize是相当罕见的,但如果决定取决于请求参数,可能会有用例......
如果您不想在请求级别进行任何授权,您只需:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin();
}
您只声明表单登录,并且没有请求安全性。但不要忘记请求安全性使用的资源少于方法安全性。
答案 2 :(得分:0)
如前所述,使用方法级安全性来保护控制器方法并使用业务逻辑来保护方法并不常见。即使您需要根据请求属性执行授权,也应该可以使用基于URL的安全性和Web安全表达式来实现此目的。
可用表达式由
WebSecurityExpressionRoot
类定义,其实例在评估Web访问表达式时用作表达式根对象。此对象还直接在名称HttpServletRequest
下公开request
对象,因此您可以直接在表达式中调用请求。
Here您可以找到有关何时使用基于URL的安全性以及何时使用方法级安全性的更多详细信息。