- Стандартный JWT носителя: отправляется в заголовке Authorization (например, Authorization: Bearer ) с областями/полномочиями.
- JWT пользовательского сеанса: отправляется в настраиваемом заголовке (например, X-Authorization-Session: Bearer ), который не содержит никаких полномочий — его нужно просто проверить на подлинность (срок действия, эмитент, подпись и т. д.).
- Некоторым конечным точкам должен требоваться только токен сеанса (просто проверьте достоверность, без полномочий).
- Некоторым конечным точкам требуется и то, и другое: сначала проверка токена сеанса, затем проверка стандартного токена носителя и использование его полномочий для авторизации.
- Некоторым конечным точкам требуется только стандартный токен носителя.
Код: Выделить всё
ReactiveAuthenticationManagerResolverКод: Выделить всё
oauth2ResourceServer(oauth2 -> oauth2.authenticationManagerResolver(standardBearerTokenAuthenticationManagerResolver))Код: Выделить всё
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http, ReactiveAuthenticationManagerResolver authManagerResolver) {
Customizer authorizeExchangeCustomizer = authorizeExchangeSpec -> authorizeExchangeSpec
.pathMatchers("/api/public").permitAll()
.anyExchange().authenticated();
return http
.csrf(ServerHttpSecurity.CsrfSpec::disable)
.authorizeExchange(authorizeExchangeCustomizer)
.oauth2ResourceServer(oauth2 -> oauth2.authenticationManagerResolver(authManagerResolver))
.build();
}
Код: Выделить всё
@Bean
@Order(1)
public SecurityWebFilterChain sessionTokenSecurityWebFilterChain(ServerHttpSecurity http, ReactiveAuthenticationManagerResolver sessionAuthResolver) {
ServerWebExchangeMatcher sessionTokenPaths = ServerWebExchangeMatchers.pathMatchers("/api/session", "/api/sessionAndStandardToken");
var sessionTokenConverter = new ServerBearerTokenAuthenticationConverter();
sessionTokenConverter.setBearerTokenHeaderName("X-Authorization-Session");
return http
.securityMatcher(sessionTokenPaths)
.authorizeExchange(exchange -> exchange.matchers(sessiontokenPaths).authenticated())
.oauth2ResourceServer(oAuth2 -> oAuth2.authenticationManagerResolver(sessionAuthResolver)
.bearerTokenConverter(sessionTokenConverter))
.build();
}
@Bean
@Order(2)
public SecurityWebFilterChain standardTokenSecurityWebFilterChain(ServerHttpSecurity http,ReactiveAuthenticationManagerResolver standardAuthResolver) {
ServerWebExchangeMatcher standardTokenPaths = ServerWebExchangeMatchers.pathMatchers("/api/admin", "/api/sessionAndStandardToken");
return http
.securityMatcher(standardTokenPaths)
.authorizeExchange(exchange -> exchange.matchers(standardTokenPaths).authenticated())
.oauth2ResourceServer(oAuth2 -> oAuth2.authenticationManagerResolver(standardAuthResolver))
.build();
}
@Bean
@Order(3)
public SecurityWebFilterChain defaultSecurityWebFilterChain(ServerHttpSecurity http) {
return http
.securityMatcher(ServerWebExchangeMatchers.anyExchange())
.authorizeExchange(exchange -> exchange.pathMatchers("/api.public").permitAll())
.build();
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-security
Мобильная версия