gpt4 book ai didi

用于 API 的 Spring webflux 自定义身份验证

转载 作者:IT老高 更新时间:2023-10-28 13:51:55 25 4
gpt4 key购买 nike

我正在为 Angular 5 应用程序创建 API。我想使用 JWT 进行身份验证。
我想使用 spring security 提供的功能,以便我可以轻松地使用角色。

我设法禁用了基本身份验证。但是在使用 http.authorizeExchange().anyExchange().authenticated(); 时,我仍然会收到登录提示。
我只想给出 403 而不是提示。因此,通过检查 Authorization header 中的 token 的“事物”(它是过滤器吗?)覆盖登录提示。

我只想在将返回 JWT token 的 Controller 中进行登录。但是我应该使用什么 spring 安全 bean 来检查用户凭据?我可以构建自己的服务和存储库,但我希望尽可能使用 Spring Security 提供的功能。

这个问题的简短版本是:
如何自定义spring security的认证方式?
我必须创建什么 bean?
我必须把配置放在哪里? (我现在有一个 SecurityWebFilterChain 的 bean)

我能找到的关于在 webflux 中使用 spring security 进行身份验证的唯一文档是:https://docs.spring.io/spring-security/site/docs/5.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#jc-webflux

最佳答案

经过大量搜索和尝试,我想我找到了解决方案:

您需要一个包含所有配置的 SecurityWebFilterChain bean。
这是我的:

@Configuration
public class SecurityConfiguration {

@Autowired
private AuthenticationManager authenticationManager;

@Autowired
private SecurityContextRepository securityContextRepository;

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
// Disable default security.
http.httpBasic().disable();
http.formLogin().disable();
http.csrf().disable();
http.logout().disable();

// Add custom security.
http.authenticationManager(this.authenticationManager);
http.securityContextRepository(this.securityContextRepository);

// Disable authentication for `/auth/**` routes.
http.authorizeExchange().pathMatchers("/auth/**").permitAll();
http.authorizeExchange().anyExchange().authenticated();

return http.build();
}
}

我已禁用 httpBasic、formLogin、csrf 和注销,以便进行自定义身份验证。

通过设置 AuthenticationManagerSecurityContextRepository,我覆盖了默认的 spring 安全配置,以检查用户是否通过了请求的身份验证/授权。

身份验证管理器:

@Component
public class AuthenticationManager implements ReactiveAuthenticationManager {

@Override
public Mono<Authentication> authenticate(Authentication authentication) {
// JwtAuthenticationToken is my custom token.
if (authentication instanceof JwtAuthenticationToken) {
authentication.setAuthenticated(true);
}
return Mono.just(authentication);
}
}

我不完全确定身份验证管理器的用途,但我认为是为了进行最终身份验证,所以在一切正常时设置 authentication.setAuthenticated(true);

SecurityContextRepository:

@Component
public class SecurityContextRepository implements ServerSecurityContextRepository {

@Override
public Mono<Void> save(ServerWebExchange serverWebExchange, SecurityContext securityContext) {
// Don't know yet where this is for.
return null;
}

@Override
public Mono<SecurityContext> load(ServerWebExchange serverWebExchange) {
// JwtAuthenticationToken and GuestAuthenticationToken are custom Authentication tokens.
Authentication authentication = (/* check if authenticated based on headers in serverWebExchange */) ?
new JwtAuthenticationToken(...) :
new GuestAuthenticationToken();
return new SecurityContextImpl(authentication);
}
}

在加载时,我将根据 serverWebExchange 中的 header 检查用户是否已通过身份验证。我用 https://github.com/jwtk/jjwt .无论用户是否通过身份验证,我都会返回不同类型的身份验证 token 。

关于用于 API 的 Spring webflux 自定义身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354171/

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