之前有篇文章记录了我是如何快速添加spring-security模块的,虽然快速,但是功能很简单。最近需要添加一个新的功能,就是验证用户是否过期。
实现方法肯定很多,但是首先要考虑自己项目当前什么个结构。在我的web.xml中,有两个Filter,如下:
<filter>
<filter-name>CodeFilter</filter-name>
<filter-class>com.platform.util.CheckCodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CodeFilter</filter-name>
<url-pattern>/j_spring_security_check</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>
第一个filter就是用来验证安全码的,第二个就是spring-security发挥功能的filter。
开始,我打算在CodeFilter中验证用户是否过期。
filterChain.doFilter(request, response);
Object exceptObject = session.getAttribute(
"SPRING_SECURITY_LAST_EXCEPTION");
if (exceptObject != null
&& exceptObject instanceof AccountExpiredException)
response.sendRedirect("login.jsp?errInfo=3");
高人一看就知道这里错了,doFilter之后,是不能再sendRedirect的。我这么想的原因就是springSecurityFilterChain运行之后才会有验证结果,我才好判断是否有过期的异常。
没办法,只能到login.jsp页面去干这件事情了。
session = request.getSession(false);
if(session!=null){
Object exceptObject = session
.getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
if (exceptObject != null
&& exceptObject instanceof AccountExpiredException)
{
out.println("<script language='JavaScript' defer='defer'>");
out.println("alert('用户已过期!');");
out.println("</script>");
}
return;
}
另外我用的是spring-security2.0,好像不支持验证用户过期。下面是JdbcDaoImpl里的一段代码,从这里看,有关是否不过期的变量都被true默认代替了,所以,得自己写一个自己的JdbcDaoImpl。
protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
String username = rs.getString(1);
String password = rs.getString(2);
boolean enabled = rs.getBoolean(3);
UserDetails user = new User(username, password, enabled, true, true, true,
new GrantedAuthority[] {new GrantedAuthorityImpl("HOLDER")});
return user;
}
我写的JdbcDaoImpl取名叫MyJdbcDaoImpl。并且要在applicationContext.xml中进行配置:
<bean id="securityService" class="com.platform.util.MyJdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<security:authentication-provider user-service-ref="securityService">
<security:password-encoder hash="md5"/>
</security:authentication-provider>