Я создаю уровень безопасности для своего веб-сервиса, используя как LDAP, так и JSON Web Token (JWT).Идея такова:
- Проверьте, включен ли токен в запрос.Если да, выполните аутентификацию этого пользователя с помощью этого токена.
- Если нет, выполните аутентификацию этого пользователя с помощью
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()
никогда не называется.
Не могли бы вы объяснить это мне (с примерами)?Спасибо за вашу помощь.