Spring Security:如果没有指定@PreAuthorize,如何默认拒绝请求

Posted

技术标签:

【中文标题】Spring Security:如果没有指定@PreAuthorize,如何默认拒绝请求【英文标题】:Spring Security: How to reject a request by default if no @PreAuthorize was specified 【发布时间】:2017-01-06 23:15:58 【问题描述】:

我有一个简单的 Spring Boot 应用程序,它公开了一个 REST API。 我已经使用 @PreAuthorize("hasRole('ROLE_4')") 注释成功地配置了 Spring Security,以根据其 ROLE 保护其余 API 中的每个方法。

我注意到,如果我根本不放置 @PreAuthorize 注释,则框架允许向任何经过身份验证的用户发出此请求。我想扭转这种行为。因此,如果其中一位程序员忘记添加 @PreAuthorize 注释,任何对该方法的请求都将被自动拒绝。

这是我的配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter 

@Override
protected void configure(HttpSecurity http) throws Exception 

    //Disable HTTP Basic authentication
    http.httpBasic().disable();

    //Add the filters
    http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.authenticationProvider(securityServiceAuthenticationProvider());



@Bean
public AuthenticationProvider securityServiceAuthenticationProvider() 
    return new SecurityServiceAuthenticationProvider();



谢谢 盖伊·胡达拉

【问题讨论】:

【参考方案1】:

您可以使用 MethodSecurityInterceptor;示例 XML 配置是 here。该示例将安全性应用于单个 bean,但表达式非常灵活,您可以保护例如名称以“Controller”结尾的任何类的所有公共成员。我之前使用过类似的 XML 配置,但我没有使用 Java 配置这样做;但我想你可以在 Java 配置中做同样的事情。

【讨论】:

【参考方案2】:

你可以指定一个自定义的AccessDecisionManager,如果查询的对象是MethodInvocation,那么检查它是否有@PreAuthorize注解;如果是,就让它过去吧。否则,失败。您可以像这样将其添加到配置中:http.authorizeRequests().accessDecisionManager(myManager)

【讨论】:

谢谢。我试过了。我使用了以下配置: .authorizeRequests().accessDecisionManager(accessDecisionManager()).anyRequest().authenticated(); 但我得到的是 FilterInvocation,而不是 方法调用。我是 Spring Security 的新手,必须承认,我并不完全了解这个框架。

以上是关于Spring Security:如果没有指定@PreAuthorize,如何默认拒绝请求的主要内容,如果未能解决你的问题,请参考以下文章

Spring security - 指定顺序时多个httpsecurity不起作用[重复]

Spring Security:从数据库表中获取当前用户的字段

用户身份验证失败时的 Spring Security ProviderNotFoundException

使用 Spring Security 保护 REST 端点

Spring Security + OAuth,如果没有访问令牌则回退

田帅spring security教程第二章: 自定义登录认证流程