Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?
Posted
技术标签:
【中文标题】Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?【英文标题】:Spring Boot HttpSecurity - @PreAuthorize - How to set AuthenticationFilter? 【发布时间】:2021-05-02 17:21:30 【问题描述】:我目前正在开发 API 授权。所以基本上我有一个过滤器JwtAuthorizationFilter
。例如,在我的 RestController 中,我想注释应该通过 @PreAuthorize("hasRole('ADMIN')")
过滤的请求。所以我现在的问题是:我如何设置WebSecurityConfigureAdapter
(或任何其他东西)以将注释与 JwtAuthorizationFilter 链接?
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
// Basically permit every request, but if needed (through @PreAuthorize) check via JwtAuthorizationFilter)
谢谢! 最好的问候塞巴斯蒂安
【问题讨论】:
当 Spring Security 中已经内置了一个 jwt 过滤器时,为什么还要有一个 jwt 过滤器? docs.spring.io/spring-security/site/docs/current/reference/… 【参考方案1】:JwtAuthorizationFilter
的目的应该是设置Authentication
的授予权限。那么,Spring Security 的默认方法 security 就足够了。
你有几个选择:
使用 Spring Security 的内置 JWT 支持
如果 JWT 是由授权服务器生成的,那么 Spring Security's default JWT support 可能就足够了。 Spring Security 附带BearerTokenAuthenticationFilter
和JwtAuthenticationProvider
。过滤器将解析Authorization
标头以获取令牌,并且提供程序将验证令牌并构造一个基于scope
或scp
声明的Authentication
。在这种情况下,您会执行@PreAuthorize("hasAuthority('SCOPE_ADMIN')")
之类的操作。
如果您需要自定义如何将 JWT 声明转换为 GrantedAuthority
s,那么您可以发布 JwtAuthenticationConverter
@Bean
。
有关完整的设置详细信息,请查看Spring Security's OAuth 2.0 Resource Server sample。不过,基本上,您的配置应该是这样的:
http
.authorizeRequests((authz) -> authz
.anyRequest().authenticated()
)
.oauth2ResourceServer((oauth2) -> oauth2
.jwt(Customizer.withDefaults())
);
在没有授权服务器的情况下使用 Spring Security 的内置 JWT 支持
Spring Security 的现有支持在设计时考虑了授权服务器,但这不是必需的。
您可以改为让您的应用程序mint self-signed tokens。
自己动手
您可以保留您的JwtAuthorizationFilter
,但尚不清楚为什么 Spring Security 现有的支持不足。要添加过滤器,您只需执行addFilterBefore(myFilter, BearerTokenAuthenticationFilter.class)
。您可以查看 BearerTokenAuthenicationFilter
作为创建自己的过滤器时应考虑的一些事项的示例。
【讨论】:
感谢您的详细说明! 我很高兴,@SebastianBrunnert以上是关于Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 具有不同用户详细信息的多个 HTTPSecurity 服务在 Spring Boot 中不起作用
Spring boot 2.0 HttpSecurity auth 在没有发送 Authorization 标头的情况下不起作用
HttpSecurity 配置不适用于 Spring 上的 Keycloak Adapter
Spring Security源码:HttpSecurity 详解