org.springframework.security.authentication.InternalAuthenticationServiceExceptionz
这个错多是userDetailService实现类里@Autowide或者@refernce注入service或者dao为null。UserDetailsService时无法注入数据库持久层的service、dao.
SpringSecurity4使用UserDetailsService时无法注入数据库持久层的service、dao
spring的加载文件还没有加载进来,所以导致无法,对于这种处理方式只需要在启动项目是加载下spring的配置文件:
这是spring-secrity配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--不需要登录即可访问-->
<http pattern="/login.html" security="none"></http>
<http pattern="/login_error.html" security="none"></http>
<http pattern="/img/**" security="none"></http>
<http pattern="/js/**" security="none"></http>
<http pattern="/css/**" security="none"></http>
<http pattern="/*.ico" security="none"></http>
<!--页面拦截规则-->
<http>
<!--所有资源必须有管理员权限才能访问-->
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></intercept-url>
<!--当前的工程实现表单登录-->
<form-login login-page="/login.html" default-target-url="/index.html" authentication-failure-url="/login.html"></form-login>
<!--退出登录-->
<logout ></logout>
<csrf disabled="true"></csrf>
</http>
<!--认真管理器-->
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="bcryptEncoder"></password-encoder>
</authentication-provider>
</authentication-manager>
<beans:bean id="userDetailService" class="com.qingcheng.controller.UserDetailServiceImpl"></beans:bean>
<beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></beans:bean>
</beans:beans>
这是webxml,spring-security集成了UserDetailsService的类中Dao注入不进去解决dao层注入为null,加入spring配置文件进来就行了。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml
classpath*:applicationContext*.xml</param-value
</context-param>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml
classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</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>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
一定要在web.xml里加入初始化sping配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml
classpath*:applicationContext*.xml</param-value>
</context-param>