Ответ 1
Класс, который вы ищете
DefaultServices
, метод revokeToken(String tokenValue)
.
Здесь пример контроллера, который отменяет токен, и здесь конфигурацию oauth2 с помощью DefaultServices
bean.
В контроллере выхода из системы я попытался написать много комбинации кода. Теперь у меня есть это:
final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
new SecurityContextLogoutHandler().logout(request, response, auth);
}
SecurityContextHolder.getContext().setAuthentication(null);
auth.setAuthenticated(false);
Но после того, как введенный токен выполнения кода все еще действителен.
Чем я ошибаюсь? Как отозвать маркер в конце концов?
Класс, который вы ищете
DefaultServices
, метод revokeToken(String tokenValue)
.
Здесь пример контроллера, который отменяет токен, и здесь конфигурацию oauth2 с помощью DefaultServices
bean.
Если вам нужно отменить токен для другого пользователя, кроме текущего (например, администратор хочет отключить учетную запись пользователя), вы можете использовать это:
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
поток немного устарел, но для пользователей 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);
}
На стороне клиента просто перехватите эту ошибку и отключите пользователя надеюсь, это поможет кому-то.
Простой пример отзыва токена для текущего авторизованного пользователя с использованием DefaultTokenServices:
Нужен Bean для магазина токенов по умолчанию
@Bean
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
return defaultTokenServices;
}
Тогда вы можете написать свой собственный контроллер
@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);
}
}
Autowire DefaultTokenServices затем используйте этот код:
String authHeader = request.getHeader("Authorization");
String tokenValue = authHeader.replace("bearer", "").trim();
tokenService.revokeToken(tokenValue);
tokenService.setAccessTokenValiditySeconds(1);
tokenService.setRefreshTokenValiditySeconds(1);
Просто попробуйте код, чтобы отменить токен доступа.