Spring4+SpringMVC4+Hibernate4集成Spring Security问题
异常:passwordEncoder must be a PasswordEncoder instance
对与Srping Security的问题,网上能查到的不多,许多东西也是东凑西凑再加上自己查文档并实践和尝试,问题才能得到解决。
报错信息:
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'passwordEncoder' threw exception; nested exception is java.lang.IllegalArgumentException: passwordEncoder must be a PasswordEncoder instance
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1514)
... 97 more
报错说的很明显,缺少了Spring Security的密码编码器实例。
原因:applicationContext-security.xml文件中的Base64PasswordEncoder没有实现Spring Security的PasswordEncoder(目前版本4.x,导入的包是org.springframework.security.crypto.password.PasswordEncoder)接口。
<!-- 认证配置, 使用userDetailsService提供的用户信息 -->
<s:authentication-manager alias="authenticationManager">
<s:authentication-provider user-service-ref="userDetailsService">
<s:password-encoder ref="base64PasswordEncoder" />
</s:authentication-provider>
</s:authentication-manager>
<!-- 项目实现的用户查询服务 -->
<bean id="userDetailsService"
class="com.ywx.tiles.account.service.impl.UserDetailsServiceImpl" />
<!-- 密码加密 -->
<bean id="base64PasswordEncoder" class="com.ywx.tiles.account.service.impl.Base64PasswordEncoder" />
实现 PasswordEncoder接口并覆写encode和matches方法,密码的加密在encode方法中实现,matches方法是匹配账号是否正确。
Spring-security配置文件中的配置,UserDetailsServiceImpl 也需要实现Srping Security的UserDetailsService接口,并覆写loadUserByUsername方法,并且需要返回一个实例对象,否则也会报如下信息:
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.ywx.tiles.account.service.impl.UserDetailsServiceImpl] to required type [org.springframework.security.core.userdetails.UserDetailsService] for property 'userDetailsService': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:302)
at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:576)
... 101 more