我正在构建一个简单的Sring MVC应用程序。现在我正在尝试添加Spring安全性。我添加了一个customUserDetailsService
,它使用DAO访问MySql数据库并获取用户。
@Transactional(readOnly = true)
public class CustomUserDetailService implements UserDetailsService {
@EJB(name = "UserDAOLocal")
UserDAOLocal dao = null;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
System.out.println("Checking if this is invoked")
UserDetails user = null;
DBUsers dbUser = dao.findUserName(username);
user = new User(dbUser.getUserName(), dbUser.getPassword(), true, true, true, true, getAuthorities(dbUser.getAccess()));
return user;
}
private GrantedAuthority[] getAuthorities(Integer access) {
GrantedAuthority[] authList = new GrantedAuthority[2];
authList[0] = new GrantedAuthorityImpl("ROLE_USER");
if (access.compareTo(1) == 0) {
authList[1] = new GrantedAuthorityImpl(("ROLE_ADMIN"));
}
return authList;
}
}
我已将UserDetailsService
添加到Spring-security.xml
。
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="customUserDetailsService"/>
</security:authentication-manager>
<bean id="customUserDetailsService" class="service.CustomUserDetailService"/>
我将j_spring_security_check
作为操作添加到login.jsp
页面上的登录表单。
当我输入有效的用户名和密码时,应用程序总是说错了。更不用说我找不到任何时候customUserDetailsService
正在运行的证据。 (我使用System.out.println("Checking if this is invoked")
来检查服务器)。
什么调用loadUserByUsername()
的{{1}}方法?什么时候被调用?
我如何配置它?
(我提供的所有代码可能都是不必要的:))
编辑: 这是Spring-Security.xml的其余部分
CustomUserDetailsService
我通过编辑这样的身份验证提供程序解决了这个问题。我决定不使用DAO和用户数据库。并在xml文件中使用了硬编码用户
<security:http auto-config="true">
<security:intercept-url pattern="/AddEmployee.htm" access="ROLE_ADMIN"/>
<security:intercept-url pattern="/FireEmployee.htm" access="ROLE_ADMIN"/>
<security:intercept-url pattern="/employees.htm" access="ROLE_USER"/>
<security:form-login login-page="/login.htm"
authentication-failure-url="/login.htm?error=true"
login-processing-url="/j_spring_security_check.htm"
default-target-url="/common.htm"/>
<security:logout
invalidate-session="true"
logout-success-url="/login.htm"
logout-url="/logout.htm"/>
</security:http>
这很有效。
但我想知道为什么我的customUserDetailService从未使用过,并学习如何正确使用它。
答案 0 :(得分:2)
分享更多配置。来自Spring-security.xml会有所帮助(如果可能的话)
设计Spring安全性,以便您的身份验证提供程序调用返回userDetails对象的loadUserByUsername()
UserDetailsService
方法。
流程如下:
Authentication Manager
的任务是验证用户身份。因此,它将用户名发送到Authentication provider
。
Authentication Provider
调用loadUserByUsername()
方法并传递返回userDetails
对象的String类型的用户名。
现在,此userDetails
对象包含用于身份验证的所有必要信息,例如用户名,密码,isEnabled等。
现在,如果您想自定义userDetailsService
以使用Dao
,则可以对其进行自定义。
这是您的身份验证过程的工作方式。 您可以参考此link以获得更广泛的理解。