2015-06-22 72 views
0

我使用spring安全性(3.1.4),spring安全性不調用loadUserByUsername()方法。我使用自定義的UserDetailsS​​ervice豆未調用loadUserByUsername(),因此,獲得以下異常(NullPointerException異常)Spring安全性:loadUserByUsername()未被調用

SEVERE: Servlet.service() for servlet [myWebapp] in context with path   [/urbanbinge-web] threw exception [Request processing failed; nested exception  is java.lang.NullPointerException] with root cause 
    java.lang.NullPointerException 
     at `enter code here`in.urbanbinge.rest.LoginController.authenticate(LoginController.java:65) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100) 
     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604) 
     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565) 
     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at in.urbanbinge.greengerong.PreRenderSEOFilter.doFilter(PreRenderSEOFilter.java:66) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
     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:259) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
     at java.lang.Thread.run(Unknown Source) 

這裏用於認證用戶的自定義登錄頁,是配置文件

網絡。 XML

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 

<display-name>Urban Binge</display-name> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/myWebapp-servlet.xml 
     /WEB-INF/spring/security-context-config.xml 
     /WEB-INF/spring/applicationcontext-social.xml 
    </param-value> 
</context-param> 


<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

<filter> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
    <servlet-name>myWebapp</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>myWebapp</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>urbanBingeWeb</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 


<filter> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>singleSession</param-name> 
     <param-value>false</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter> 
    <filter-name>prerender</filter-name> 
    <filter-class>in.urbanbinge.greengerong.PreRenderSEOFilter</filter-class></filter> 

<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
</welcome-file-list> 

安全上下文-config.xml中

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.springframework.org/schema/security" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security.xsd"> 

<global-method-security pre-post-annotations="enabled" /> 
<http pattern="/resources/**" security="none" /> 

<http use-expressions="true" authentication-manager-ref="authenticationManager"> 
    <http-basic entry-point-ref="unauthorisedEntryPoint"/> 
    <access-denied-handler error-page="/#!/login"/> 

    <intercept-url pattern="/secured/users/userinfo/*" access="hasAnyRole('A','O','E','M')"/> 
    <intercept-url pattern="/secured/users/del" access="hasAnyRole('A','O','E','M')"/> 
    <intercept-url pattern="/secured/users/add" access="permitAll"/> 


<!-- Other configurations -- > 



<logout invalidate-session="true" delete-cookies="JSESSIONID" /> 
    <session-management session-fixation-protection="newSession"/> 
</http> 

<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="customUserDetailsService"> 
     <password-encoder hash="sha-256" /> 
    </authentication-provider> 
</authentication-manager> 

注:在上面的配置文件hasAnyRole()參數A,O,M,E是角色

CustomUserDetailsS​​erviceImpl java類

@Service("customUserDetailsService") 
public class CustomUserDetailsServiceImpl implements UserDetailsService { 

private static Logger LOGGER = Logger.getLogger(CustomUserDetailsServiceImpl.class); 

@Autowired 
private UserRepository userRepository; 

@Override 
public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException { 
    UserDetails userDetails = null; 
    try { 
     LOGGER.debug("loadUserByUsername : username : "+username); 
    // I put a break point in below statement using intellij idea but call didn't came here  
    in.urbanbinge.orm.entities.User user = userRepository.findByEmailId(username); 
     userDetails = new User(user.getEmailId(),user.getPassword(),(user.getIsActive() == 0 ? false : true), true, true, true, getAuthorities(user.getRole())); 
    } catch (Exception e) { 
     LOGGER.error("Error : "+e.getMessage()); 
     throw new UsernameNotFoundException("Error in retrieving user"); 
    } 
    LOGGER.debug("UserDetails Found : "+userDetails); 
    return userDetails; 
} 

public Collection<GrantedAuthority> getAuthorities(final String role) { 

     // Create a list of grants for this user 
     List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2); 

     // Assigning role to the user 
     authList.add(new SimpleGrantedAuthority(role)); 

     LOGGER.debug("authList : "+authList); 

     // Return list of granted authorities 
     return authList; 
    } 
+0

添加控制器,爲什麼你有一個控制器? Spring Security應該負責。當你在'myWebapp-servlet.xml'中定義的兩次加載你的bean時,你的配置也有缺陷。 –

回答

0

一種可能性(儘管非常基本)是認證失敗。除非用戶名和密碼不清除認證,否則loadUserByUsername()不會被調用。 請讓我知道這個解決方案是否對你有幫助。

+0

我在UI中給出正確的用戶名和密碼。 – Raj

+0

嗯,你可以通過在數據庫中運行查詢來做最後的檢查,只是爲了確保密碼是正確的 – Mudassar

+0

我做到了這一點以及我得到的結果..沒有密碼問題..我確信用戶名和密碼是正確的 – Raj

相關問題