2015-06-17 3 views
2

Я пытаюсь добавить функцию входа в систему с помощью поиска базы данных с помощью 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. Благодаря!

+0

Не уверен, что это ваша проблема, но в соответствии с http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#jc-form вам нужно добавить «allowAll()» в разрешить доступ к вашим URL-адресам входа – Nitek

+0

@Nitek Спасибо. '/ login' разрешен. Я просто для этого не делал этого. Разрешения должны быть в порядке - я не видел признаков того, что это должно быть проблемой. – Andy0708

+1

переименуйте 'j_username' в' username' и 'j_password' в' password' или измените свойства имени пользователя и пароля. Имена по умолчанию изменены при использовании конфигурации на основе java. В настоящее время ни одно имя пользователя не будет передано никакому механизму аутентификации. Я также предполагаю, что там, где вы написали 'UserDetails', вы фактически используете' UserDetailsService' !? –

ответ

5

При использовании Spring Security с конфигурацией на основе Java имя параметров запроса являются username и password и не j_username и j_password больше.

Вы можете исправить вашу форму Войти

<form action="/login/process" method="POST"> 
    <input name="username" id="j_username" type="text" /> 
    <input name="password" id="j_password" type="password" /> 

    <input type="submit" value="Login" /> 
</form> 

или адаптировать конфигурацию использовать старые имена полей.

formLogin().usernameParameter("j_username").passwordParameter("j_password"); 

В любом случае разрешите вашу проблему.

Смежные вопросы