Насколько я понимаю, ваш вопрос о том, "как проверить токен активен?" а не «как перенаправить пользователя на страницу входа?».
Как я вижу, вы добавили теги "spring-boot" и "keycloak", возможно, вы могли бы использовать "Keycloak Spring Boot Adapter". Предполагая, что вы используете версию 3.4 Keycloak (v4.0 все еще в бета-версии), вы можете найти некоторую документацию здесь .
Если вы не можете (или не хотите) использовать Spring Boot Adapter, вот часть KeycloakSecurityContextRequestFilter
исходного кода , которая может быть интересна для вашего случая:
KeycloakSecurityContext keycloakSecurityContext = getKeycloakPrincipal();
if (keycloakSecurityContext instanceof RefreshableKeycloakSecurityContext) {
RefreshableKeycloakSecurityContext refreshableSecurityContext = (RefreshableKeycloakSecurityContext) keycloakSecurityContext;
if (refreshableSecurityContext.isActive()) {
...
} else {
...
}
}
и вот (Java) исходный код метода getKeycloakPrincipal:
private KeycloakSecurityContext getKeycloakPrincipal() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
Object principal = authentication.getPrincipal();
if (principal instanceof KeycloakPrincipal) {
return KeycloakPrincipal.class.cast(principal).getKeycloakSecurityContext();
}
}
return null;
}
И если вы хотите понять, как устанавливается Аутентификация в SecurityContextHolder, прочитайте этот фрагмент (Java) кода из KeycloakAuthenticationProcessingFilter
:
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
if (authResult instanceof KeycloakAuthenticationToken && ((KeycloakAuthenticationToken) authResult).isInteractive()) {
super.successfulAuthentication(request, response, chain, authResult);
return;
}
...
SecurityContextHolder.getContext().setAuthentication(authResult);
...
try {
chain.doFilter(request, response);
} finally {
SecurityContextHolder.clearContext();
}
}
В качестве альтернативы вы также можете проверить этот github-репозиторий dynamicind:
https://github.com/dynamind/grails3-spring-security-keycloak-minimal
Надеясь, что может помочь.
С уважением,
Jocker.