2017-02-16 96 views
0

我試圖用電子郵件,而不是使用Spring Security的UserDetailService驗證用戶名登錄使用UserDetailService郵箱登錄身份驗證,但我不能能夠登錄並獲得在SpringSecurity

org.springframework.security.authentication.InternalAuthenticationServiceException.

當調試代碼,調試器不不去後

Users user = userDao.findByUserName(useremail); from UserServiceImpl.java and occurred error.

可能有一個步驟需要更多的地方。 配置和Java代碼和錯誤日誌如下: -

的applicationContext.xml

<security:http auto-config="true"> 
     <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 
     <security:intercept-url pattern="/customer/**" access="ROLE_USER" /> 
     <security:form-login login-page="/login" 
      default-target-url="/product/productList/all" authentication-failure-url="/login?error" 
      username-parameter="username" password-parameter="password" /> 
     <security:logout logout-success-url="/login?logout" /> 
    </security:http> 

    <security:authentication-manager> 
     <security:authentication-provider user-service-ref="userServiceImpl"> 
       <security:password-encoder ref="bcryptEncoder" /> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <bean id="userServiceImpl" class="com.emusicstore.service.impl.UserServiceImpl" /> 

    <bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" > 
    <constructor-arg name="strength" value="11" /> 
    </bean> 

的Login.jsp

<form name="loginForm" action="<c:url value="/j_spring_security_check" />" method="post"> 

       <c:if test="${not empty error}"> 
        <div class="error" style="color: #ff0000;">${error}</div> 
       </c:if> 

       <div class="form-group"> 
        <label for="username">Email : </label> 
        <input type="text" id="username" name="username" class="form-control" /> 
       </div> 
       <div class="form-group"> 
        <label for="password">Passwrod:</label> 
        <input type="password" id="password" name="password" class="form-control" /> 
       </div> 
       <input type="submit" value="Submit" class="btn btn-default"> 
       <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
      </form> 

UserServiceImpl.java

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.security.authentication.jaas.AuthorityGranter; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.emusicstore.dao.UserDao; 
import com.emusicstore.model.Users; 
import com.emusicstore.service.UserService; 
@Service 
@Transactional 
@Qualifier("userServiceImpl") 
public class UserServiceImpl implements UserDetailsService{ 

    @Autowired 
    private UserDao userDao; 

    @Override 
    public UserDetails loadUserByUsername(String useremail) 
      throws UsernameNotFoundException { 
     Users user = userDao.findByUserEmail(useremail); 
     if(user == null){ 
      throw new UsernameNotFoundException("UserName or Password Invalid."); 
     } 
     return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getEnabled(), true, true, true, getGrantedAuthorities(userDao.getUserRole(user.getUsersId()))); 
    } 

    private final List<GrantedAuthority> getGrantedAuthorities(final List<String> roleList) { 
     final List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     for (final String role : roleList) { 
      authorities.add(new SimpleGrantedAuthority(role)); 
     } 
     return authorities; 
} 
} 

控制檯錯誤如下:

ERROR: org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - An internal error occurred while trying to authenticate the user. org.springframework.security.authentication.InternalAuthenticationServiceException at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:110) at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:132) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:92) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at com.emusicstore.service.impl.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:33) at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:102) ... 35 more

請幫助我克服通過上面的錯誤。

非常感謝。

回答

0
Users user = userDao.findByUserEmail(useremail); 

以上userDao.findByUserEmail(useremail);返回空值。

+1

我在ApplicationContext.xml中錯誤地將此代碼在運行時彈簧中找不到要自動裝入的服務,但實際上它應該在我的dispatcher-servlet.xml下。謝謝。 – soewin

0

我相信它是一個簡單的NullPointerException在您的自定義代碼。將斷點放入33中的UserServiceImpl.java中並檢查。

Caused by: java.lang.NullPointerException at com.emusicstore.service.impl.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:33)

相關問題