2017-02-12 96 views
2

我是新来的春天,一直在线以及几个教程。我创建了一个包含使用用户名和密码登录的应用程序。现在一切都开始正常工作,但由于我一直在应用程序上工作,它已开始登录失败,给出一个空指针的问题,但没有给出任何具体细节。这在开始时发生过一次或两次,但现在越来越严重,现在需要重新启动应用程序7或8次才能让我登录。该应用程序启动正常,但一旦我输入用户名和密码它崩溃了。春季开机登录失败

我正在使用h2数据库进行测试,这些数据用于测试用户和数据。如果有人能够帮助解决这个问题,或者指引我朝着正确的方向发展,那就太好了。以下是我的文件和Stacktrace。如果还有其他文件,您认为我应该添加以帮助获得答案留下评论,我会添加它们。

我的属性文件。

spring.h2.console.enabled=true 
spring.h2.console.path=/console 
spring.datasource.platform=h2 

我的IndexController

@Controller 
public class IndexController { 

    @RequestMapping("/") 
    public String index() { 
     return "/index"; 
    } 

    @RequestMapping("/access_denied") 
    public String notAuth() { 
     return "access_denied"; 
    } 

    @RequestMapping("/login") 
    public String loginForm() { 
     return "login"; 
    } 

    @RequestMapping("/logout") 
    public String logout() { 
     return "login"; 
    } 

} 

我WebSecurity配置

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    private AuthenticationProvider authenticationProvider; 

    @Autowired 
    @Qualifier("daoAuthenticationProvider") 
    public void setAuthenticationProvider(AuthenticationProvider  authenticationProvider) { 
     this.authenticationProvider = authenticationProvider; 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder(StrongPasswordEncryptor passwordEncryptor) { 
     PasswordEncoder passwordEncoder = new PasswordEncoder(); 
     passwordEncoder.setPasswordEncryptor(passwordEncryptor); 
     return passwordEncoder; 
    } 

    @Bean 
    public DaoAuthenticationProvider daoAuthenticationProvider(PasswordEncoder passwordEncoder, 
                  UserDetailsService userDetailsService) { 

     DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); 
     daoAuthenticationProvider.setPasswordEncoder(passwordEncoder); 
     daoAuthenticationProvider.setUserDetailsService(userDetailsService); 
     return daoAuthenticationProvider; 
    } 

    @Autowired 
    public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder) { 
      authenticationManagerBuilder.authenticationProvider(authenticationProvider); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable().headers().disable() 
      .authorizeRequests().antMatchers("/", "/index", "/**/favicon.ico") .permitAll() 
      .and().authorizeRequests().antMatchers("/css/**", "/js/**", "/images/**").permitAll() 
      .and().formLogin().loginPage("/login").permitAll() 
      .and().authorizeRequests().antMatchers("/companies/**") 
      .hasRole("ADMIN") 
      .and().authorizeRequests().antMatchers("/expenses/new", "/expenses/edit/**", "expenses/save") 
      .hasAnyRole("ADMIN, MANAGER") 
      .and().authorizeRequests().antMatchers("/expenses/list", "/expenses/**") 
      .hasAnyRole("ADMIN, MANAGER, WORKER") 
      .anyRequest().authenticated() 
      .and().logout() 
      .permitAll() 
      .and().exceptionHandling().accessDeniedPage("/access_denied"); 
    } 
} 

这是UserDetailsImpl

public class UserDetailsImpl implements UserDetails { 

    private Collection<SimpleGrantedAuthority> authorities; 
    private Integer id; 
    private String username; 
    private String password; 
    private Boolean enabled = true; 

    public void setAuthorities(Collection<SimpleGrantedAuthority> authorities) { 
     this.authorities = authorities; 
    } 

    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() { 
     return authorities; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public String getPassword() { 
     return password; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @Override 
    public String getUsername() { 
     return username; 
    } 

    @Override 
    public boolean isAccountNonExpired() { 
     return true; 
    } 

    @Override 
    public boolean isAccountNonLocked() { 
     return true; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() { 
     return true; 
    } 

    public void setEnabled(Boolean enabled) { 
     this.enabled = enabled; 
    } 

    @Override 
    public boolean isEnabled() { 
     return enabled; 
    } 
} 

SpringUserDetialsImpl其使用转换器在结合用户类

@Service("userDetailsService") 
public class SpringUserDetailsImpl implements UserDetailsService { 

    private UserService userService; 
    private Converter<User, UserDetails> userUserDetailsConverter; 

    private static final Logger logger = LoggerFactory.getLogger(SpringUserDetailsImpl.class); 

    @Autowired 
    public void setUserService(UserService userService) { 

     this.userService = userService; 
    } 

    @Autowired 
    @Qualifier(value = "userToUserDetails") 
    public void setUserUserDetailsConverter(Converter<User, UserDetails> userUserDetailsConverter) { 

     this.userUserDetailsConverter = userUserDetailsConverter; 
    } 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 

     logger.info(String.format("User %s was found", userService.findByUsername(username).getUsername())); 
     return userUserDetailsConverter.convert(userService.findByUsername(username)); 
    } 
} 

和转换器类

@Component 
public class UserToUserDetails implements Converter<User, UserDetails> { 

    private static final Logger logger = LoggerFactory.getLogger(UserToUserDetails.class); 

    @Override 
    public UserDetails convert(User user) { 

     UserDetailsImpl userDetails = new UserDetailsImpl(); 

     if (user != null) { 

      userDetails.setId(user.getId()); 
      userDetails.setUsername(user.getUsername()); 
      userDetails.setPassword(user.getEncryptedPassword()); 
      userDetails.setEnabled(user.getValid()); 

      Collection<SimpleGrantedAuthority> authorities = new ArrayList<>(); 

      user.getRoles().forEach(role -> authorities.add(new SimpleGrantedAuthority(role.getRole()))); 

      userDetails.setAuthorities(authorities); 

      logger.info(String.format("User details %s", userDetails.getUsername())); 

      return userDetails; 
     } else { 

      System.out.print("This is an issue"); 
      return userDetails; 
     } 
    } 
} 

而且堆栈跟踪

2017-02-12 21:30:49.807 ERROR 15146 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 

java.lang.NullPointerException: null 
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:164) ~[spring-security-core-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE] 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar:8.5.5] 
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] 
+0

请出示您的UserDetailsS​​ervice或在github上发布,也许整个应用程序? –

+0

变化(自动装配)为'@Autowired私人的AuthenticationProvider的AuthenticationProvider;' –

+1

@PrasannaKumar你是对的添加“@Autowired”到的AuthenticationProvider的AuthenticationProvider变量一些奇怪的原因似乎是工作。我想用Spring正确的协议是要么使用依赖二传手或者构造。如果你想给一个完整的答案和一些解释,我可以将其标记为正确的。 –

回答

0

添加@AutowiredauthenticationProvider;

@Autowired将构造函数,字段,setter方法或配置方法标记为由Spring的依赖注入工具自动装配。

当你想使用它作为的Spring bean你需要自动装配的bean.It可以

  • setter方法被用来

    @Autowired public void setSpellChecker(SpellChecker spellChecker){ this.spellChecker = spellChecker; }

  • 构造函数

    @Autowired public TextEditor(SpellChecker spellChecker){ System.out.println("Inside TextEditor constructor."); this.spellChecker = spellChecker; }

  • 属性,在你的情况下,对性能的。

    @Autowired private AuthenticationProvider authenticationProvider;