gpt4 book ai didi

java - Spring Security如何确保 header

转载 作者:行者123 更新时间:2023-12-01 16:37:18 32 4
gpt4 key购买 nike

我有Spring安全配置,我为特定端点创建AuthenticationWebFilter。就我而言,可以说是 /api/login。对于此端点,我想使用基本 usr/pass 身份验证对用户进行身份验证。任何其他端点都应该无需授权即可免费使用。

 @Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.csrf()
.disable()
.authorizeExchange()
.and()
.addFilterAt(buildUsernamePasswordAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
.authorizeExchange()
.anyExchange()
.permitAll();
return http.build();
}

private AuthenticationWebFilter buildUsernamePasswordAuthenticationFilter() {
UserDetailsRepositoryReactiveAuthenticationManager authManager = new UserDetailsRepositoryReactiveAuthenticationManager(applicationUserService);
authManager.setPasswordEncoder(passwordEncoder);

AuthenticationWebFilter usernamePasswordAuthenticationFilter = new AuthenticationWebFilter(authManager);
usernamePasswordAuthenticationFilter.setRequiresAuthenticationMatcher(ServerWebExchangeMatchers.pathMatchers("api/login"));
return usernamePasswordAuthenticationFilter;
}

我还有 LoginController 来处理使用 AuthenticatedPinciple 的登录:

@RestController
@RequestMapping("/api")
public class LoginController {

@PostMapping("/login")
public Mono<Map<String, Object>> login(@AuthenticationPrincipal Mono<AuthenticatedUser> user) {
....
}

}

只要 Authorization header 存在且有效,使用正确或不正确的凭据登录都可以正常工作。

问题:

如果我尝试 POST 到此端点,但 Authorization header 已损坏或根本没有,我想发回 400 BAD_REQUEST,最好是自定义正文,表示“无效的身份验证 token ”或 w/e 。我认为 Springs AuthenticationWebFilter 会解决这个问题。我很疲惫,相反,它只是将 null 作为 AuthenticationPrinciple 传播到 LoginController,并因 500 错误而崩溃。甚至不是一个空的单声道,而是一个空。

问题:确保将请求发送到“/api/login”时存在正确的 Authorization header 的最佳方法是什么,如果没有发回正确的 400 响应并且不执行 Controller 映射。

最佳答案

最好的正确方法是使用 Spring Security 中内置的基本身份验证功能。您不需要创建自己的过滤器,httpBasic 已经在 Spring Security 中可用。

http security

如果您希望仅将安全性应用于某些端点,您可以使用 antMatchers 进行定义。

protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.antMatchers("/api/login")
.authenticated()
)
.httpBasic(withDefaults());
}

关于java - Spring Security如何确保 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61930827/

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