мой конфигуратор безопасности < /p>
Код: Выделить всё
@Configuration
@EnableWebFluxSecurity
@RequiredArgsConstructor
@EnableReactiveMethodSecurity
public class SecurityConfig {
private final CookieAuthenticationFilter cookieAuthenticationFilter;
private final SecureTokenAuthManager secureTokenAuthManager;
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http
.csrf(ServerHttpSecurity.CsrfSpec::disable)
.securityContextRepository(new WebSessionServerSecurityContextRepository())
.authorizeExchange(exchange -> exchange
.pathMatchers("/api/ticket").permitAll()
.pathMatchers("/api/**").access(secureTokenAuthManager)
.anyExchange().permitAll()
)
.addFilterAt(cookieAuthenticationFilter, SecurityWebFiltersOrder.AUTHENTICATION)
.build();
}
}
< /code>
Мой веб-фильтр < /p>
@Component
@RequiredArgsConstructor
public class CookieAuthenticationFilter implements WebFilter {
public static final String TOKEN_COOKIE_NAME = "token";
@Override
public Mono filter(ServerWebExchange exchange, @NonNull WebFilterChain chain) {
var context = ReactiveSecurityContextHolder.withAuthentication(null);
Optional tokenCookie = Optional.ofNullable(exchange.getRequest().getCookies().getFirst(TOKEN_COOKIE_NAME));
if (tokenCookie.isPresent() && !tokenCookie.get().getValue().isBlank()) {
String tokenId = tokenCookie.get().getValue();
context = ReactiveSecurityContextHolder.withAuthentication(new SecureTokenAuthentication(tokenId));
}
return chain.filter(exchange)
.contextWrite(context);
}
}
< /code>
и мой контроллер < /p>
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/game")
public class GameController {
private final PlayerFacade playerFacade;
@GetMapping
public Mono getGameState() {
return ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.filter(it -> it instanceof SecureTokenAuthentication)
.filter(Authentication::isAuthenticated)
.map(it -> (SecureTokenAuthentication) it)
.map(SecureTokenAuthentication::getToken)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ways-empty