Как отменить токен аутентификации в spring безопасности?

В контроллере выхода из системы я попытался написать много комбинации кода. Теперь у меня есть это:

final Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (auth != null) {
    new SecurityContextLogoutHandler().logout(request, response, auth);
}

SecurityContextHolder.getContext().setAuthentication(null);
auth.setAuthenticated(false);

Но после того, как введенный токен выполнения кода все еще действителен.

Чем я ошибаюсь? Как отозвать маркер в конце концов?

Ответ 1

Класс, который вы ищете DefaultServices, метод revokeToken(String tokenValue).

Здесь пример контроллера, который отменяет токен, и здесь конфигурацию oauth2 с помощью DefaultServices bean.

Ответ 2

Если вам нужно отменить токен для другого пользователя, кроме текущего (например, администратор хочет отключить учетную запись пользователя), вы можете использовать это:

Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientIdAndUserName(
                                                           "my_oauth_client_id", 
                                                           user.getUsername());
for (OAuth2AccessToken token : tokens) {
  consumerTokenServices.revokeToken(token.getValue());
}

Если tokenStore является org.springframework.security.oauth2.provider.token.TokenStore и consumerTokenServices, являющимся org.springframework.security.oauth2.provider.token.ConsumerTokenServices

Ответ 3

поток немного устарел, но для пользователей JWTToken это не работает, поскольку токены не сохраняются. Поэтому еще один вариант - использовать фильтр. 1 создайте метод для администратора, чтобы заблокировать/разблокировать пользователя в вашей базе данных. 2 используйте фильтр, и если метод нуждается в проверке подлинности, если пользователь активен или нет

Пример:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if(authentication != null
            &&  authentication.getName() != null
            && !authentication.getName().equalsIgnoreCase("anonymousUser")) {
        UserModel user = userService.getUser(authentication.getName());
        if(user != null && !user.isActivated())
            throw new SecurityException("SECURITY_USER_DISABLED");
    }
    chain.doFilter(request, response);
}

На стороне клиента просто перехватите эту ошибку и отключите пользователя надеюсь, это поможет кому-то.

Ответ 4

Простой пример отзыва токена для текущего авторизованного пользователя с использованием DefaultTokenServices:

  1. Нужен Bean для магазина токенов по умолчанию

    @Bean 
    public DefaultTokenServices tokenServices() {
         DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
         defaultTokenServices.setTokenStore(tokenStore());
         defaultTokenServices.setSupportRefreshToken(true);
         return defaultTokenServices;
    }
    
  2. Тогда вы можете написать свой собственный контроллер

    @RestController
    @RequestMapping("/user")
    public class UserApi {
    
    @Autowired
    private DefaultTokenServices tokenServices;
    
    @Autowired
    private TokenStore tokenStore;
    
    @DeleteMapping("/logout")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void revokeToken() {
        final OAuth2Authentication auth = (OAuth2Authentication) SecurityContextHolder
                .getContext().getAuthentication();
        final String token = tokenStore.getAccessToken(auth).getValue();
        tokenServices.revokeToken(token);
    }
    }
    

Ответ 5

Autowire DefaultTokenServices затем используйте этот код:

String authHeader = request.getHeader("Authorization");
String tokenValue = authHeader.replace("bearer", "").trim();
tokenService.revokeToken(tokenValue);
tokenService.setAccessTokenValiditySeconds(1);
tokenService.setRefreshTokenValiditySeconds(1);

Просто попробуйте код, чтобы отменить токен доступа.