gpt4 book ai didi

Spring针对不同的api端点提供多种身份验证方法

转载 作者:行者123 更新时间:2023-12-02 04:53:05 28 4
gpt4 key购买 nike

我想检查不同端点的不同身份验证方法。我想使用的方法是 x509 和 jwt。我需要使用 x509 来处理某些端点,并使用 JWT 来处理所有其他请求。

这是我的网络安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {


@Configuration
@Order(1)
public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/transaction/testf").authenticated().and()
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(new X509UserDetailsService())
;
}
}

@Configuration
@Order(2)
public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/token", "/api/dealer/login").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
;
}

}
}

此配置仅检查 /api/transaction/testf 端点是否有 x509 证书,并允许所有其他端点进行响应。我需要其他端点在没有 jwt token 的情况下返回 503。

最佳答案

您有两个过滤器链。它们都没有正确配置 http.antMatcher 的入口点模式。这意味着它们被配置为使用 /** 作为入口点模式。

例如

    @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()

与说的是同一件事:

    @Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.anyRequest().fullyAuthenticated()

我们在这里所说的是

  1. http - 安全过滤器链
  2. http.antMatcher - 安全过滤器链的入口点
  3. http.authorizeRequests - 我的端点访问限制的开始
  4. http.authorizeRequests.antMatchers - 具有特定访问权限的 URL 列表

因此,您需要做的是更改您的 @Order(1) 过滤器链以缩小模式范围。例如:http.antMatcher("/api/transaction/**")

您的配置现在如下所示


@Configuration
@Order(1)
public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/transaction/**") //customized entry point
.authorizeRequests()
.antMatchers("/api/transaction/testf").authenticated().and()
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(new X509UserDetailsService())
;
}
}

@Configuration
@Order(2)
public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**") //this is default
.authorizeRequests()
.antMatchers("/oauth/token", "/api/dealer/login").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
;
}

根据您现有的配置,名为 ApiWebSecurityConfig 的过滤器链将捕获所有调用。另一个过滤器链 ApiTokenSecurityConfig 从未使用过。

关于Spring针对不同的api端点提供多种身份验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54706291/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com