需求:网站的前台和后台不同的url需要不同的登陆页面,不同的异常捕获方式。
spring-security3.1以后的版本支持多个<http>标签,因此本文所采用的方式就是使用两个,实际上是三个<http>标签实现上述功能(为什么是是要三个将会在下面加以说明)
spring-security.xml配置如下
<!-- 后台管理 --> <http pattern="/admin/**" authentication-manager-ref="authmanager" > <intercept-url pattern="/admin/login**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <form-login login-page="/admin/login.jsp" authentication-failure-url="/admin/login_fail.jsp" default-target-url="/admin/index.jsp" login-processing-url="你的Url"/> </http> <!-- 前台 --> <http pattern="/mycenter/**" authentication-manager-ref="authmanager"> <intercept-url pattern="/front/login**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/mycenter/**" access="ROLE_USER" /> <form-login login-page="/front/login.jsp" authentication-failure-url="/front/login_fail.jsp" default-target-url="/front/index.jsp" login-processing-url="你的Url"/> </http>
按照上述方法配置后,会出现程序代码中,无法获取当前登录用户信息的情况。SecurityContextHolder.getContext()为空。尤其是不在前台后台正则匹配下的url的程序段中。
出现这种情况是因为两个http拦截了两种特定的url表达式,那么其余的url将不会被springsecurity拦截,因此也就没办法再相应url的方法中获得当前登录用户的信息。
解决方法是在加上第三个<http>标签,匹配任意的url来把其余的url配置到过滤器。
时间: 2024-10-22 11:31:58