问题描述:在集成cas后,如果在A应用里面直接调用B应用的某个页面,第一次点击的时候总是会跳转到B应用设置的默认页面,然后再点击的时候,才能跳转到正确的页面。
后来通过查看源码,发现
类:org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler
protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
if (isAlwaysUseDefaultTargetUrl()) {
return defaultTargetUrl;
}
// Check for the parameter and use that if available
String targetUrl = request.getParameter(targetUrlParameter);
......
}
这个方法首先会判断是否设置了一直访问默认页面,如果false,则先获取request里面是否存在spring-security-redirect的参数,这个地址就是真正要跳转的URL;
<!-- cas 认证成功控制器 -->
<beans:bean id="authenticationSuccessHandler"
class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
<beans:property name="alwaysUseDefaultTargetUrl" value="false" />
<beans:property name="defaultTargetUrl" value="/index.htm" />
</beans:bean>
这个配置改好后,接下这是怎么把spring-security-redirect带到url后面了,再看这个类CasAuthenticationEntryPoint
类:org.springframework.security.cas.web.CasAuthenticationEntryPoint
public final void commence(final HttpServletRequest servletRequest, final HttpServletResponse response,
final AuthenticationException authenticationException) throws IOException, ServletException {
final String urlEncodedService = createServiceUrl(servletRequest, response);
final String redirectUrl = createRedirectUrl(urlEncodedService);
preCommence(servletRequest, response);
response.sendRedirect(redirectUrl);
}
protected String createServiceUrl(final HttpServletRequest request, final HttpServletResponse response) {
return CommonUtils.constructServiceUrl(null, response, this.serviceProperties.getService(), null, this.serviceProperties.getArtifactParameter(), this.encodeServiceUrlWithSessionId);
}
这是验证未登录后,构建跳转的页面和参数(也就是登录页面)的处理方法,那在这里可以写一个类继承CasAuthenticationEntryPoint,重写createServiceUrl方法,spring-security-redirect的参数拼到redirectUrl后面,并且将当前请求url获取到;
自定义类:CasAuthenticationRedirect
public class CasAuthenticationRedirect extends CasAuthenticationEntryPoint{
private String serviceUrlBak=null;
@Override
protected String createServiceUrl(final HttpServletRequest request, final HttpServletResponse response) {
if(serviceUrlBak==null)
serviceUrlBak=getServiceProperties().getService();
if(serviceUrlBak!=null){
String ctx=request.getContextPath();
String queryString=request.getQueryString();
String requestURI=request.getRequestURI();
requestURI=requestURI.substring(requestURI.indexOf(ctx)+ctx.length(),requestURI.length());
String serviceUrl="";
if(!requestURI.equals("/") && requestURI.length()>0){
serviceUrl="?"+AbstractAuthenticationTargetUrlRequestHandler.DEFAULT_TARGET_PARAMETER;
serviceUrl+="="+requestURI;
if(StringUtils.isNotBlank(queryString)){
serviceUrl+="?"+queryString;
}
}
getServiceProperties().setService(serviceUrlBak+serviceUrl);
}
return super.createServiceUrl(request, response);
}
}
最后再将配置改一下:
<beans:bean id="casEntryPoint" class="net.assertion.CasAuthenticationRedirect">
......
</beans:bean>
这样就OK了, 这是目前找到最简单的解决方法了,不过,感觉既然spring提供了spring-security-redirect这个参数,应该会有相应的配置可以实现这个功能吧,哎...,主要是英文文档看不懂......
分享到:
相关推荐
这是一个Spring Security集成CAS实现单点登录的客户端实例,使用Maven集成开发,项目中使用到的Oframer和otauser(CAS服务端)请至我的资源中寻找下载。
cas版本3.4.0,spring security版本3.1.4,经测试可用!
cas是Central Authentication Service的简写.提供中央认证服务,实现企业级单点登录.详细参考:http://blog.csdn.net/xiejx618/article/details/51703469
springboot+security+cas集成demo。。
本篇文章主要介绍了spring boot整合CAS Client实现单点登陆验证的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring security 结合cas 单点登录系统 cas客户端的配置文件
本篇文章主要介绍了详解Spring Boot 使用Spring security 集成CAS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
单点登录实现 Spring_security+CAS 包含实现教程和程序源代码
SpringBoot+Security+Cas 的一个Demo,想学习的可以参考下
Cas安装包以及入门demo案例,还有springSecurity与CSA的集成Demo
springsecurity整合cas全过程,超低分分享,请大家下载看看
Spring Security 3 与 CAS单点登录配置.doc
springboot(springboot + shiro + oracle) + vue 集成cas
SSO单点登录Spring-Security & CAS 使用手册
1.本项目为SpringCloud Gateway的微服务框架,整合了SpringSecurity,微服务间使用Redis来获取登陆的用户信息。 2.由于Gat
spring-security多登录页面配置,包括前台和后台分开登录界面,注销登录返回不同的界面等。
1.SpringSecurity 3.2实例,继承SpringMVC 3.2; 2.默认账户 admin,admin; 3.模拟后台数据加载,未集成数据库;
SpringSecurity自定义登陆页面,当登陆失败后,需要在页面上回显错误信息,但是错误信息又是由SpringSecurity自己封装的,我们如何去获取并且如何将错误信息转换成中文显示在页面上,本资源对其进行了详情的解决,...
Spring集成SpringSecurity依赖包.也有springMVC的依赖包,直接下载引入就可用
spring-security多个登录页面配置,分开了前台登录页面和后台登录页面登录,还有注销返回的不同的界面。