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