Spring Security - авторизация на остальных apis - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь реализовать авторизацию на основе ролей на моем остальном API. Мне удалось успешно реализовать и запустить проект, но есть некоторые вещи, которые меня не устраивают.

CustomeUserDetailsService. java:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    Optional<UsersAuth> optionalUsers = usersAuthRepository.findByName(username);

    optionalUsers
            .orElseThrow(() -> new UsernameNotFoundException("Username not found"));
    return optionalUsers
            .map(CustomUserDetails::new).get();
}

CustomUserDeatils. java:

 @Override
public Collection<? extends GrantedAuthority> getAuthorities() {

    return getRoles()
            .stream()
            .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRole()))
            .collect(Collectors.toList());
}

Я хочу знать, что на самом деле делают два приведенных выше фрагмента кода. кто-нибудь может мне объяснить? Я много искал, но не понял. В частности, какая польза от предоставленных полномочий? Я точно знаю, что CustomUserDetailsService принимает имя пользователя и, если его не существует, выдает исключение. Если кто-нибудь может подробно рассказать? Это мне очень поможет.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Самый простой способ ответить: когда вы пытаетесь войти в систему с именем пользователя и паролем, весенняя служба безопасности вызывает loadUserByUsername с тем именем пользователя, которое вы указываете. Этот метод ищет в базе данных, существует ли какой-либо пользователь с таким именем. Если не генерирует исключение. В противном случае возвращает объект UserDetails. Затем Spring Security проверяет, совпадает ли пароль объекта UserDetails с паролем, который вы указали. Если не генерирует исключение. В противном случае предоставляет вам токен аутентификации.

Пользователь может иметь роль, и эта роль может использоваться для разрешения / блокировки API для этого пользователя. Например, в базе данных этот пользователь имеет роль CUSTOMER, а некоторые другие пользователи имеют роль ADMIN. Теперь вы хотите, чтобы определенный api /abc был доступен только пользователям с ролью CUSTOMER. Для этого вам необходимо сделать это

@PreAuthorize("hasAnyAuthority('CUSTOMER')")
@PostMapping(value = "/abc")
  public ResponseEntity<Map<String, Integer>> create(@Valid @RequestBody DTO dto) {
  ...

Вышеупомянутый api доступен только пользователю с ролью CUSTOMER

1 голос
/ 05 августа 2020
Optional<UsersAuth> optionalUsers = usersAuthRepository.findByName(username);

Он ищет пользователя по его имени, вероятно, в базе данных или другом хранилище в памяти.

optionalUsers
            .orElseThrow(() -> new UsernameNotFoundException("Username not found"));

Как вы уже знаете, эта строка выдаст исключение, если Optional пуст в другом слова user не существуют.

return optionalUsers
            .map(CustomUserDetails::new).get();

Эта строка создает новый объект класса CustomUserDeatils, реализующий интерфейс UserDetails, и возвращает его. CustomUserDeatils имеет конструктор с параметром UsersAuth.

return getRoles()
            .stream()
            .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRole()))
            .collect(Collectors.toList());

Это простое отображение, вероятно, Role коллекции в SimpleGrantedAuthority список. Как я упоминал ранее, класс CustomUserDeatils реализует UserDetails . Один из его методов - Collection<? extends GrantedAuthority> getAuthorities(), который используется для получения информации о полномочиях, предоставленных пользователю. AuthenticationProvider будет использовать эту информацию из UserDetailsService для создания объекта Authentication. Spring Security будет проверять, есть ли у аутентифицированного пользователя требуемые роли и c, используя эти сопоставленные роли. SimpleGrantedAuthority - это просто реализация GrantedAuthority. ROLE_ - префикс по умолчанию, используемый RoleVoter, когда вы проверяете роли в методе вашего контроллера, например, @Secured("ROLE_ADMIN")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...