Spring Boot Security - Нужно ли мне реализовывать свой собственный UserDetailsService? - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю уровень безопасности для своего веб-сервиса, используя как LDAP, так и JSON Web Token (JWT).Идея такова:

  1. Проверьте, включен ли токен в запрос.Если да, выполните аутентификацию этого пользователя с помощью этого токена.
  2. Если нет, выполните аутентификацию этого пользователя с помощью Basic, подключившись к серверу LDAP.

Итак, для каждого запроса, который долженДля аутентификации пользователь должен указать либо имя пользователя / пароль, либо токен.

Это моя конфигурация LDAP:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    // @formatter:off
    auth
            .ldapAuthentication()
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                    .ldif("classpath:test-server.ldif")
                    .root("dc=springframework,dc=org")
                    .port(8389)
                .and()
            .passwordCompare()
                .passwordEncoder(passwordEncoder())
                .passwordAttribute("userPassword");
    // @formatter:on

    // Do I need this? Why?
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

Как вы можете видеть из моей конфигурации выше, я использую пользовательскийUserDetailsService.Это реализация:

@Service
public class LdapUserService implements UserDetailsService {

    private LdapUserRepository ldapUserRepository;

    @Autowired
    public LdapUserService(LdapUserRepository ldapUserRepository) {
        this.ldapUserRepository = ldapUserRepository;
    }

    // When is this function called?
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        LdapUser ldapUser = ldapUserRepository.findByUsername(username);

        if (ldapUser == null) {
            throw new UsernameNotFoundException(username);
        }

        // How can I access this return value somewhere else?
        return new User(ldapUser.getUsername(), ldapUser.getPassword(), new ArrayList<>());
    }
}

Все отлично работает.Тем не менее, я не полностью понимаю все настройки.

  • Нужен ли пользовательский UserDetailsService?
  • Почему?Почему нет?
  • Когда исполняется этот код выше?Как я могу получить доступ к возвращаемому значению где-то еще?Мне кажется, что мой loadUserByUsername() никогда не называется.

Не могли бы вы объяснить это мне (с примерами)?Спасибо за вашу помощь.

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