如何通过URL模式配置不同的身份验证过滤器?

时间:2019-06-06 10:08:00

标签: spring-security

我有一个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”)

2 个答案:

答案 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)

    }
  }
}