Java 使用@PreAuthorize时的安全配置

Java 使用@PreAuthorize时的安全配置,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我的安全配置类(从WebSecurityConfigureAdapter继承)有如下方法 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/restaurant/**").access("hasRole('ROLE_USER')") .and() .f

我的安全配置类(从WebSecurityConfigureAdapter继承)有如下方法

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

然而,我宁愿在我的控制器上使用@PreAuthorize。如果删除该方法,则所有内容都需要auth。我的方法应该是什么样的,这样一切都可用,访问权限只由预授权决定?

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

在控制器方法上使用@PreAuthorize是相当少见的,但如果决策取决于请求参数,则可能会有一些用例

如果您不想在请求级别进行任何授权,您只需:

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

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

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

可用表达式由
WebSecurityExpressionRoot
类定义,在计算web访问表达式时,该类的实例用作表达式根对象。该对象还直接公开了名为
request
HttpServletRequest
对象,因此您可以在表达式中直接调用该请求

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