1、前后台登录页面;扩展AuthenticationEntryPoint过滤器
2、前后台认证成功页面;自定义过滤器扩展AuthenticationProcessingFilter过滤器
3、前后台认证失败页面;自定义过滤器扩展AuthenticationProcessingFilter过滤器
4、前后台无权限页面; access-denied-page
5、前后台注销返回页面。配置<logout logout-success-url="/login.jsp" invalidate-session="true" />标签
1)现象描述由于我们主页采用ajaxlogin方式因此结合springsecurity的话有一个默认的defaluttarget 和 intercepet page
通过把defaluttarget 定义为一个action 内部含有status 调用的时候利用struts的ajaxplugin 把转为json状态。当有intercept页面的时候通过
重写AbstractProcessingFilter.java 类中涉及到的RedirectUtils里面让其不要自动跳转而是向页面端发送一个json格式的字符串。
2)当解决了1中的描述后,又遇到一个问题,就是在注册的时候我们想要实现注册最后一步后自动登录的实现。但是由于spring security 是根据defaluttarget 和 intercepet page来redirct后者当我们改成ajax方式后就会像前台发送ajax的数据。但是在注册的时候没有拦截到跳转页就会导向action页面 而我们想让其导向其他页面,因此做法就是:
在登录的最后一步把一个值放到session中然后在redirect的时候判断这个值是否存在 存在就按照我想的跳转。
具体修改可以如下:
AbstractProcessingFilter.java 为 AuthenticationProcessingFilter的父类 修改 AbstractProcessingFilter来实现登录不同行为的跳转
我通过修改
protected void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url)
throws IOException {
if (request.getSession().getAttribute("login_type") != null) {
Properties properties = PropertiesFile.getProperties("/properties/casUrl.properties");
java.lang.String httpPrefix = properties.getProperty("httpPrefix");
java.lang.String httpAVerPortalPrefix = properties.getProperty("httpAVerPortalPrefix");
java.lang.String str = httpPrefix + httpAVerPortalPrefix;
request.getSession().removeAttribute("login_type");
url = str;
}
RedirectUtils.sendRedirect(request, response, url, useRelativeContext);
}
方法加入了加色字体部分来改变redirect 方向。
但是这个方法有些时候不能取到session中的东西,有些时候能成功,但是有些时候session中没值,不知道什么原因
因此通过在request后带参数参数格式为XXX/j_spring_cas_security_check?type=XX&URL=xxx
修改使得service XXX/j_spring_cas_security_check支持后带参数修改如下:
修改pacpackage org.jasig.cas中的CentralAuthenticationServiceImpl中的validateServiceTicket目的是由于在XML配置的service是不带参数的,而传过去的service是带参数的,两个就不会相同,因此要改写这个方法使得只要去除参数后相同就可以了。
完整的类CentralAuthenticationServiceImpl