我有一个spring boot应用程序,主要提供REST端点,通过JWT进行身份验证。我想将JWT与secret1一起使用来验证/ internal_api / ** API,对JWT与secret2一起使用来进行其他身份验证。我不知道如何配置此场景。是否需要两个SecurityConfig类进行配置?
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.antMatchers("/internal_api/**")
.addFilterAt(JwtTokenAuthFilter("secret1"), UsernamePasswordAuthenticationFilter::class.java)
.authorizeRequests()
.anyRequest().permitAll()
}
}
我希望具有JWT(secret1)的用户可以访问/ internal_api / **(通过JwtTokenAuthFilter(“ secret1”)) 并与JWT(secret2)一起使用可以访问/ other_resource / **(通过JwtTokenAuthFilter(“ secret2”)
答案 0 :(得分:0)
您可以只使用相同的JwtTokenAuthFilter
。关键是您必须决定用户应具有哪些角色或权限才能访问这些端点。然后,在JwtTokenAuthFilter
中对JWT进行身份验证期间,您将确定当前请求的用户是否具有这些角色。如果是,请确保为SecurityContext
中设置的用户对象分配了这些角色。
假设/internal_api/**
要求ROLE_INTERNAL
进行访问,而/other_resource/**
要求ROLE_OTHER
进行访问。配置如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/internal_api/**").hasRole("INTERNAL")
.antMatchers("/other_resource/**").hasRole("OTHER")
//blablbabla.....
}
答案 1 :(得分:0)
通过这些天的在线搜索,我终于找到了更好的实现方式。
根据弹簧official document推荐的方法。
创建和自定义过滤器链部分:
与一组应用程序相比,许多应用程序对一组资源的访问规则完全不同。例如,承载UI和支持API的应用程序可能支持基于cookie的身份验证以及对UI部件的登录页面的重定向,以及基于令牌的身份验证以及对API部件的未经身份验证的请求的401响应。每组资源都有其自己的WebSecurityConfigurerAdapter以及唯一的顺序和自己的请求匹配器。如果匹配规则重叠,则最早的有序过滤器链将获胜。
class SecurityConfig {
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
class InternalApiConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http.antMatcher("/internal_api/**")
http.authorizeRequests()
.antMatchers("/internal_api/**").authenticated()
http.addFilterAt(JwtTokenAuthFilter("secret1"), UsernamePasswordAuthenticationFilter::class.java)
}
}
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 9)
class ApiConfig : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http.authorizeRequests()
.antMatchers("/other_resource/**").authenticated()
http.addFilterAt(JwtTokenAuthFilter("secret2"), UsernamePasswordAuthenticationFilter::class.java)
}
}
}