spring security StackOverflow Error

时间:2016-02-12 05:44:42

标签: security spring-boot stack-overflow

我正在Spring启动应用程序中实现安全性并接收StackOverflow异常。 我有一个用户pojo和存储库来保存用户在DB中工作正常。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private UserDetailsService userDetailsService;
    ....
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .userDetailsService(userDetailsService); }

public class User {

    private String password;

    public User(User user) {
        this.password = user.password;
        ...
    }

    public String getPassword() {
        return password;
    }

期望用户的getPassword()在下面调用但不会发生 -

public class MyUserDetails extends User implements UserDetails{
    ........
    @Override
    public String getPassword() {
        return getPassword();
}

UserDetailsS​​ervice的实现 -

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    User user = userRepository.findByEmail(email);
    if (user == null)
         throw new UsernameNotFoundException("no " + email);
    return new MyUserDetails(user);
}

我通过调用userRepository.save(user)在DB中插入了一个用户/密码。 当我尝试传递无效的用户/密码时,它正确地返回无效的用户消息。 但是当我尝试使用存储在DB中的用户/密码时,我会得到以下异常 -

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause

java.lang.StackOverflowError: null
    at com.xyz.MyUserDetails.getPassword(MyUserDetails.java:27) ~[classes/:na]

1 个答案:

答案 0 :(得分:1)

看一下MyUserDetails.getPassword()方法,你会发现它会自称......无限......

public class MyUserDetails extends User implements UserDetails{
    ........
    @Override
    public String getPassword() {
        return getPassword(); // <= infinite recursion here
}

是否有一个类似名称的变量你想要返回,或者可能调用一个不同的方法(来自超类......或者不是......)?