Получение информации о пользователя, вошедшего в систему


В настоящее время у меня есть специальный сервис для получения информации о пользователя, вошедшего в систему. У меня есть интерфейс

/**
 * The service operates on the data of an authorised user.
 */
public interface AuthorizationService {
    User getUser();
    String getUserId();
    String getUsername();
    boolean isLogged();
}

и реализации

@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
    private final UserSearchService userSearchService;
    /**
     * {@inheritDoc}
     */
    @Override
    public User getUser() {
        return userSearchService.getUserByUsername(this.getUsername());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getUserId() {
        return userSearchService.getUserByUsername(SecurityContextHolder.getContext().getAuthentication().getName()).getId();
    }
...
}

и например, когда я использую метод создания сообщения, я делаю так

@Override
public String createMessage(
        @NotNull @Valid final SendMessageDTO sendMessageDTO
) throws ResourceNotFoundException, ResourceConflictException {
    log.info("Called with sendMessageDTO {}", sendMessageDTO);

    final UserEntity user = this.findUser(this.authorizationService.getUserId());
    final MessageEntity message = this.sendMessageDtoToMessageEntity(sendMessageDTO);

    message.setSender(user);

    ...
}
    private UserEntity findUser(final String id) throws ResourceNotFoundException {
        return this.userRepository
                .findByUniqueIdAndEnabledTrue(id)
                .orElseThrow(() -> new ResourceNotFoundException("No user found with id " + id));
    }
  1. Однако, я не знаю, если это хороший способ получить информацию о пользователя, вошедшего в систему?

  2. Вместо ВПД User объект, я могу вернуть entity(у меня есть правило, что я не вернусь сущность, способы получения услуг), и тогда мне бы не пришлось использовать findUser () метод для поиска пользователя. Что вы думаете об этом?

  3. Это мой способ получать ДТО User вошедшего в систему пользователя или ID безопасным способом?



107
2
задан 5 апреля 2018 в 10:04 Источник Поделиться
Комментарии
1 ответ

Как правило, вошедшего в систему пользователя и часто используемая информация хранится в сессии. И на сессии, как правило, завернутый в Context класс (как SecurityContextHolder сама по себе). Это делается потому, что вы можете отделить код от сессии или от API сервлета (или любой API, который вы используете). Это также делает его легче проверить.

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

Я бы ввести Context класс, который обеспечивает setUser и getUser метод.

Кроме того:


  • AuthorizationService: средства авторизации: пользователь позволено делать х. (В то время как проверка подлинности означает: это действительно пользователь он притворяется). Или другими словами: имя типа вводит в заблуждение.

  • getUser(): этот метод вызывает this.getUsername() -> Я не вижу код этот, я предполагаю, что это ищет имя пользователя SecurityContextHolder. Это означает, что AuthorizationService тесно связан с весенним безопасности, а это плохо. Же getUserId() -> лучше передать аргументы и положить ответственность на уровне представления (который включает в себя безопасности обычно)

1
ответ дан 11 апреля 2018 в 04:04 Источник Поделиться