2017-11-15 11 views
0

내 애플리케이션에서 스프링 보안을 사용하려고하는데 로그인에 성공할 때마다 로그인 할 때 문제가 발생합니다. Spring이 나를 failureUrl로 리디렉션합니다. 나는 내 실수를 찾고 지쳤다. 너는 나에게 적절한 길을 보여줄 수 있니? 나는 정말로 감사 할 것입니다.스프링 보안 - 항상 실패 URL로 리디렉션

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter{ 

    @Autowired 
    private RegisterService registerService; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .csrf().disable() 
       .authorizeRequests() 
       .antMatchers(
         "/registration", 
         "/js/**", 
         "/css/**", 
         "/img/**", 
         "/webjars/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin() 
       .loginPage("/login") 
       .failureUrl("/login?error") 
       .permitAll() 
       .and() 
       .logout() 
       .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login"); 
    } 

    @Bean 
    public BCryptPasswordEncoder passwordEncoder(){ 
     return new BCryptPasswordEncoder(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(registerService).passwordEncoder(passwordEncoder()); 
    } 

} 

을 그리고 서비스 responible 가입과 구성에 defaultSuccessUrl 추가

@Service 
public class RegisterService implements UserDetailsService { 

    @Autowired 
    private BCryptPasswordEncoder passwordEncoder; 

    @Autowired 
    private UserRepository userRepository; 

    public User save(UserDto userDto){ 
     User user = new User(); 
     user.setLogin(userDto.getLogin()); 
     user.setFirstName(userDto.getFirstName()); 
     user.setLastName(userDto.getLastName()); 
     user.setEmail(userDto.getEmail()); 
     user.setPassword(passwordEncoder.encode(userDto.getPassword())); 
     user.setRole("ROLE_USER"); 
     return userRepository.save(user); 
    } 

    public User findByEmail(String email){ 
     return userRepository.findByEmail(email); 
    } 

    public User findByLogin(String login){ 
     return userRepository.findByLogin(login); 
    } 

    @Override 
    public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException { 
     User user = userRepository.findByLogin(login); 
     if(user == null){ 
      throw new UsernameNotFoundException("Invalid username or password."); 
     } 

     List<GrantedAuthority> authorities = new ArrayList<>(); 
     authorities.add(new SimpleGrantedAuthority(user.getRole())); 

     return new org.springframework.security.core.userdetails.User(
       user.getLogin(), user.getPassword(), authorities); 
    } 

} 

답변

0

시도에 : 나는 또한에 대한 permitAll()를 호출 생각

@Override 
protected void configure(HttpSecurity http) throws Exception { 
http 
     .csrf().disable() 
     .authorizeRequests() 
     .antMatchers(
       "/registration", 
       "/js/**", 
       "/css/**", 
       "/img/**", 
       "/webjars/**").permitAll() 
     .anyRequest().authenticated() 
     .and() 
     .formLogin() 
     .loginPage("/login") 
     .failureUrl("/login?error") 
     .defaultSuccessUrl("/") 
     .permitAll() 
     .and() 
     .logout() 
     .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login"); 
} 

을 보안 설정과 코드가있다 formLogin은 기본값이므로 중복되어 있지만 문제가되지는 않습니다.