Spring Webflux API的自定义身份验证

我正在为Angular 5应用程序创建API。我想使用JWT进行身份验证。

我想使用Spring Security提供的功能,以便我可以轻松地使用角色。

我设法禁用基本身份验证。但是使用时http.authorizeExchange().anyExchange().authenticated();我仍然会收到登录提示。

我只想输入403而不是提示。因此,通过检查Authorization令牌标题的“事物”(是否是过滤器?)来覆盖登录提示。

我只想在将返回JWT令牌的控制器中进行登录。但是我应该使用哪种Spring Security Bean来检查用户凭证?我可以构建自己的服务和存储库,但是我想尽可能多地使用Spring Security提供的功能。

这个问题的简短版本是:

如何自定义Spring Security的身份验证?

我必须创建什么豆?

我必须在哪里放置配置?(我现在有个SecurityWebFilterChain

回答:

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

你需要一个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和注销,因此可以进行自定义身份验证。

通过设置AuthenticationManager和,SecurityContextRepository我将覆盖默认的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用户是否已通过身份验证。

以上是 Spring Webflux API的自定义身份验证 的全部内容, 来源链接: utcz.com/qa/435985.html

回到顶部