Поскольку вы говорите о UserDetailsService
Я предполагаю, что вы используете Spring Security
. Если вам нужно только пройти аутентификацию/авторизацию пользователей, я не уверен, что вам нужно полное управление пользователями, которое предлагает UserDetailsService
. Это может быть достаточно, чтобы определить один AuthenticationProvider
и запрос здесь
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@PersistenceContext
private EntityManager entityManager;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(new AuthenticationProvider() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
// Do you database query here
ArrayList<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_")); // list of roles from database
return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(),
authentication.getCredentials(), authorities);
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
})
}
}
Этот пример является встраиваемой и вы, вероятно, следует сделать AuthenticationProvider
настоящий класс.
The AuthenticationProvider
вызываются с неаутентифицированными Authentication
, который был создан с помощью фильтра, обычно BasicAuthenticationFilter
или UsernamePasswordAuthenticationFilter
. После этого Authentication
присваивается ProviderManager
, которые запрашивают каждый из AuthenticationProvider
, если они могут аутентифицировать этот тип Authentication
(это то, что поддерживает ()). Когда найден подходящий AuthenticationProvider
, его попросят подтвердить подлинность. Здесь вы просматриваете базу данных и находите роли из базы данных, а также создаете новый Authentication
со списком GrantedAuthorities
на основе ролей из базы данных.
Имейте в виде, что вы должны поставить «ROLE_» перед ролями (если вы не храните их в этом роде), в противном случае он не будет работать с декларативным доступом конфигурируется с помощью HttpSecurity
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/home").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
// more lines
}
Здесь карт ADMIN к GrantedAuthority
ROLE_ADMIN.