Я пытаюсь добавить функцию входа в систему с помощью поиска базы данных с помощью Spring Security, и я действительно борется. Я хочу найти пользователя, выполнив интерфейс UserDetailsService
. Я читал тонну документации и Googled часами, но я все еще застрял. Большинство примеров, которые я мог найти, используют XML, поэтому, возможно, мои проблемы связаны с преобразованием их в конфигурацию Java.Вход в систему безопасности Spring с UserDetailsService и конфигурацией Java
UserDetailsService
@Service
public class AccountServiceImpl implements AccountService { // AccountService implements UserDetailsService
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
// The email variable is always ''
List<GrantedAuthority> authList = new ArrayList<>();
authList.add(new Role("ROLE_USER")); // Role implements GrantedAuthority
return new User("[email protected]", "password", true, true, true, true, authList);
}
}
безопасность конфигурация
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private LogoutSuccessHandler logoutSuccessHandler;
@Autowired
private AccountService accountService;
@Override
@Bean
protected AuthenticationManager authenticationManager() throws Exception {
// This bean is required for using method security annotations
return super.authenticationManager();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/login/process")
.failureUrl("/login?error=true")
.defaultSuccessUrl("/", false)
.and()
//.userDetailsService(this.accountService)
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(this.logoutSuccessHandler)
.invalidateHttpSession(true)
.and()
// Permissions here
.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("[email protected]").password("password").roles("USER");
}
/*@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
//.userDetailsService(this.accountService);
.inMemoryAuthentication()
.withUser("[email protected]").password("password").roles("USER").and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}*/
/*@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(this.accountService);
return provider;
}*/
}
Как вы можете видеть, есть куча outcommented коды, которые являются лишь некоторые из вещей, которые я пытался это сделать Работа. Я также пробовал с простой аутентификацией в памяти, но это тоже не сработало.
login.jsp
<form action="/login/process" method="POST">
<input name="j_username" id="j_username" type="text" />
<input name="j_password" id="j_password" type="password" />
<input type="submit" value="Login" />
</form>
Debug
DEBUG org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - Request is to process authentication
DEBUG org.springframework.security.authentication.ProviderManager - Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
DEBUG org.springframework.security.authentication.dao.DaoAuthenticationProvider - User '' not found
DEBUG org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials
DEBUG org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - Updated SecurityContextHolder to contain null Authentication
выше, кажется, всегда быть для всех конфигураций, которые я пробовал. Я даже не уверен, почему используется DaoAuthenticationProvider
, даже если я пытаюсь его переопределить; Думаю, это по умолчанию. Для некоторых из вышеприведенной конфигурации вызывается моя реализация UserDetailsService
, но с пустой строкой в качестве параметра. Кроме того, даже если я верну жестко закодированный объект UserDetails
с теми же учетными данными, что и те, которые я ввел в мою форму, аутентификация по-прежнему терпит неудачу, и я перенаправляюсь обратно на /login?error=true
.
Что я здесь делаю неправильно? Пожалуйста, сообщите мне о моих ошибках или укажите простой пример с использованием конфигурации Java. Благодаря!
Не уверен, что это ваша проблема, но в соответствии с http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#jc-form вам нужно добавить «allowAll()» в разрешить доступ к вашим URL-адресам входа – Nitek
@Nitek Спасибо. '/ login' разрешен. Я просто для этого не делал этого. Разрешения должны быть в порядке - я не видел признаков того, что это должно быть проблемой. – Andy0708
переименуйте 'j_username' в' username' и 'j_password' в' password' или измените свойства имени пользователя и пароля. Имена по умолчанию изменены при использовании конфигурации на основе java. В настоящее время ни одно имя пользователя не будет передано никакому механизму аутентификации. Я также предполагаю, что там, где вы написали 'UserDetails', вы фактически используете' UserDetailsService' !? –