Как изменить пружинный объект SecurityContextHolder.getContext (). GetAuthentication () после успешного входа в систему? - PullRequest
0 голосов
/ 02 июля 2019

Я работаю над приложением весенней загрузки, в котором я создал класс CustomUserDetails, расширив UserDetails следующим образом.

public class CustomUserDetails
    extends org.springframework.security.core.userdetails.User {

private static final long serialVersionUID = 1L;

/**
 * The extra field in the login form is for the tenant name
 */
private String tenant;
private Long userId;
private String firstName;
private String middleName;
private String lastName;
private String email;
private String role;

Мне нужно изменить детали арендатора в объекте UserDetails.Для этого я проверил следующие действия:

Как обновлять ссылки Spring Security UserDetails после успешного входа в систему?

https://stackanswers.net/questions/how-to-immediately-enable-the-authority-after-update-user-authority-in-spring-security

https://dev.to/onlineinterview/user-account-loginregistration-feature-with-spring-boot--3fc3

И Контроллер находится здесь, где я обновляю объект аутентификации:

@PreAuthorize("hasRole('SUPER_ADMIN')")
@GetMapping(path = "/useTenant/{tenantId}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<ResponseDTO> useTenant(@PathVariable Long tenantId) {
    HttpStatus status = HttpStatus.OK;
    boolean error = false;
    String message = languageMessageService.getMessage(MultiLanguageKey.SUCCESS);

    // fetch master tenant by id
    Optional<MasterTenant> optional = masterTenantService.findById(tenantId);
    if (optional.isPresent()) {
        CustomUserDetails customUserDetails = customUserDetailsService.getUserDetail();
        //Changing Tenant ID
        customUserDetails.setTenant(optional.get().getTenantId());
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication instanceof UsernamePasswordAuthenticationToken) {
            // Update Current user by changing tenant id in SecurityContextHolder
            UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication;
            auth.setDetails(customUserDetails);
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
    } else {
        error = false;
        message = languageMessageService.getMessage(MultiLanguageKey.TENANT_NOT_FOUND);
    }
    return new ResponseEntity<>(new ResponseDTO(error, message), status);
}

Моя проблема в том, что, когда я нажимаю другой запрос на выполнение определенного действия, я не нашел подробностей арендатора в CustomUserDetailsобъект, который извлекается из

SecurityContextHolder.getContext (). getAuthentication ()

Пожалуйста, дайте мне знать, как я могу обновить или изменить объект UserDetails Аутентификации и сохранить обратно, чтобыдругой запрос обновляется CustomUserDetails.

1 Ответ

1 голос
/ 02 июля 2019

UserDetails должно быть установлено на Principal из UsernamePasswordAuthenticationToken, а не Details, как предложено в java docs :

Реализация AuthenticationManagerчасто будет возвращать аутентификацию, содержащую более подробную информацию, в качестве принципала для использования приложением.Многие провайдеры аутентификации будут создавать объект UserDetails в качестве принципала.

Details в UsernamePasswordAuthenticationToken - это обычно сохраняемый IP-адрес пользователя или серийный номер сертификата и т. Д.

Поэтому измените его на:

 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
 if (authentication instanceof UsernamePasswordAuthenticationToken) {
        // Update Current user by changing tenant id in SecurityContextHolder
        UsernamePasswordAuthenticationToken currentAuth = (UsernamePasswordAuthenticationToken) authentication;

        CustomUserDetails userDetail = currentAuth.getPrincipal(); 
        customUserDetails.updateTenanet("blablalb");

        UsernamePasswordAuthenticationToken updateAuth = new UsernamePasswordAuthenticationToken(userDetail , 
            currentAuth.getCredentials(),
            currentAuth.getAuthorities());

        SecurityContextHolder.getContext().setAuthentication(updateAuth);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...