java - 根据客户端 URL 启用 Spring Security 身份验证
问题描述
我有一个使用 JWT 身份验证的 Spring 应用程序。
我想知道您是否有可能根据哪个客户端访问我的后端来释放路由,例如:
clientA:8080
-/health
允许未经身份验证的路由clientB:8081
- 在/health
没有 JWT 身份验证的情况下不允许路由。
我曾尝试过这样的事情:
http.authorizeRequests().antMatchers("http://clientA/health").permitAll()
但它没有用。
解决方案
我强烈建议不要使用这种不是强身份验证机制的身份验证。但是,您可以像对多个身份验证所做的那样实现。基本上,您需要多个带有requestMatcher的WebSecurityConfigurerAdapter。
这是一个快速示例(不要这样做):
安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfigurations {
@Configuration
@Order(1)
public static class NoAuth extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.requestMatcher(r -> r.getRequestURL().toString().startsWith("http://localhost:8081"))
.authorizeRequests()
.anyRequest().permitAll();
}
}
@Configuration
@Order(2)
public static class Auth extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
final byte[] salt = "random".getBytes(StandardCharsets.UTF_8);
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 256);
SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
System.out.println(Base64.getEncoder().encodeToString(key.getEncoded()));
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.decoder(NimbusJwtDecoder.withSecretKey(key).build());
}
}
}
应用配置:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public ServletWebServerFactory serverContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createConnector());
return tomcat;
}
private Connector createConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8081);
connector.setScheme("http");
connector.setSecure(false);
return connector;
}
}
控制器
@RestController
public class HealthApi {
@GetMapping("/health")
public String health() {
return "healthy";
}
}
你可以用 curl 测试它:
curl -v localhost:8081/health
200 OK 健康
curl -v localhost:8080/health
401
curl -v -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.LUn3qZESwtUIbXrD3WSd3CNEOTwbKV9x2IahoLUCyAs" localhost:8080/health
200 OK 健康
推荐阅读
- oauth-2.0 - 在使用 PKCE 的 OAuth 2.0 授权代码流中,是什么阻止了在第一次调用身份验证服务器时拦截代码质询?
- python - 使用 scikit_learn 中的 inverse_transform MinMaxScaler 强制数据帧位于另一个数据帧的范围内
- html - 在 html 标签中添加视口特定的样式
- c# - 如何在设计时为 xaml 选择默认资源字典?
- alexa - 我能否确定 Alexa 请求是由例程还是用户触发的?
- javascript - Puppeteer - 在 page.select() 之后等待网络请求完成
- elasticsearch - 弹性查询布尔必须匹配问题
- sql - SQLite 查找带有两个“a”字母的单词
- sql - 在文本字符串中搜索特定单词 - SQL
- modelica - 新 Dymola UI 中的变量菜单在哪里?