Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?
Spring Boot HttpSecurity - @PreAuthorize - How to set AuthenticationFilter?
我目前正在开发 API 授权。所以基本上我有一个过滤器 JwtAuthorizationFilter
。在我的 RestController 中,我想注释应该通过 @PreAuthorize("hasRole('ADMIN')")
过滤的请求。所以我现在的问题是:如何使用 JwtAuthorizationFilter 将 WebSecurityConfigureAdapter
(或任何其他东西)设置为 link 注释?
@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)
}
}
谢谢!
最好的问候塞巴斯蒂安
JwtAuthorizationFilter
的目的应该是设置Authentication
的权限。然后,Spring 安全的默认方法 security 就足够了。
您有两个选择:
使用 Spring 安全性的 built-in JWT 支持
如果 JWT 是由授权服务器创建的,那么 Spring Security's default JWT support 就足够了。 Spring 安全性附带 BearerTokenAuthenticationFilter
和 JwtAuthenticationProvider
。过滤器将解析 Authorization
header 以获取令牌,提供者将验证令牌并构建基于 scope
或 scp
声明的 Authentication
.在那种情况下,你会做类似 @PreAuthorize("hasAuthority('SCOPE_ADMIN')")
.
的事情
如果您需要自定义如何将 JWT 声明转换为 GrantedAuthority
,那么您可以发布一个 JwtAuthenticationConverter
@Bean
.
有关完整的设置详细信息,请查看 Spring Security's OAuth 2.0 Resource Server sample。不过,基本上,您的配置如下所示:
http
.authorizeRequests((authz) -> authz
.anyRequest().authenticated()
)
.oauth2ResourceServer((oauth2) -> oauth2
.jwt(Customizer.withDefaults())
);
在没有授权服务器的情况下使用 Spring 安全性的 Built-in JWT 支持
Spring 安全的现有支持在设计时考虑到了授权服务器,但这不是必需的。
您可以改为申请 mint self-signed tokens。
自己动手
您可以保留 JwtAuthorizationFilter
,但不清楚为什么 Spring 安全的现有支持不足。要添加过滤器,您只需执行 addFilterBefore(myFilter, BearerTokenAuthenticationFilter.class)
。您可以查看 BearerTokenAuthenicationFilter
作为创建自己的过滤器时应考虑的一些事项的示例。
我目前正在开发 API 授权。所以基本上我有一个过滤器 JwtAuthorizationFilter
。在我的 RestController 中,我想注释应该通过 @PreAuthorize("hasRole('ADMIN')")
过滤的请求。所以我现在的问题是:如何使用 JwtAuthorizationFilter 将 WebSecurityConfigureAdapter
(或任何其他东西)设置为 link 注释?
@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)
}
}
谢谢! 最好的问候塞巴斯蒂安
JwtAuthorizationFilter
的目的应该是设置Authentication
的权限。然后,Spring 安全的默认方法 security 就足够了。
您有两个选择:
使用 Spring 安全性的 built-in JWT 支持
如果 JWT 是由授权服务器创建的,那么 Spring Security's default JWT support 就足够了。 Spring 安全性附带 BearerTokenAuthenticationFilter
和 JwtAuthenticationProvider
。过滤器将解析 Authorization
header 以获取令牌,提供者将验证令牌并构建基于 scope
或 scp
声明的 Authentication
.在那种情况下,你会做类似 @PreAuthorize("hasAuthority('SCOPE_ADMIN')")
.
如果您需要自定义如何将 JWT 声明转换为 GrantedAuthority
,那么您可以发布一个 JwtAuthenticationConverter
@Bean
.
有关完整的设置详细信息,请查看 Spring Security's OAuth 2.0 Resource Server sample。不过,基本上,您的配置如下所示:
http
.authorizeRequests((authz) -> authz
.anyRequest().authenticated()
)
.oauth2ResourceServer((oauth2) -> oauth2
.jwt(Customizer.withDefaults())
);
在没有授权服务器的情况下使用 Spring 安全性的 Built-in JWT 支持
Spring 安全的现有支持在设计时考虑到了授权服务器,但这不是必需的。
您可以改为申请 mint self-signed tokens。
自己动手
您可以保留 JwtAuthorizationFilter
,但不清楚为什么 Spring 安全的现有支持不足。要添加过滤器,您只需执行 addFilterBefore(myFilter, BearerTokenAuthenticationFilter.class)
。您可以查看 BearerTokenAuthenicationFilter
作为创建自己的过滤器时应考虑的一些事项的示例。