spring-security中添加用户过期功能

    之前有篇文章记录了我是如何快速添加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>

你可能感兴趣的:(spring,jsp,xml,Web,Security)