`
LieZueYang
  • 浏览: 9696 次
  • 性别: Icon_minigender_1
  • 来自: 郴州
社区版块
存档分类
最新评论

Spring Security集成Cas后页面跳转问题

阅读更多
问题描述:在集成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这个参数,应该会有相应的配置可以实现这个功能吧,哎...,主要是英文文档看不懂......

分享到:
评论

相关推荐

    前后端分离集成cas

    本项目是关于前后端分离集成CAS(Central Authentication Service)的一个实例,主要使用了Spring Boot、Shiro、Oracle数据库以及Vue.js等技术。 首先,Spring Boot是基于Spring框架的轻量级开发工具,它简化了新...

    springsecurity官方文档3.2

    - **设置默认的登录后目标**: 如何定义用户登录成功后的默认跳转页面。 - **登出处理**: 介绍了如何配置用户登出逻辑。 - **使用其他身份验证提供程序**: 探讨了除了内置的提供程序之外,如何添加自定义的身份...

    集成cas实现单点登录认证.zip

    - 创建CAS客户端:在你的若依(RuoYi)单体项目中,需要集成CAS客户端库,如Spring Security CAS。 - 配置应用服务:在CAS服务器上注册你的若依应用,定义服务URL和服务验证回调URL。 - 配置SSO跳转逻辑:在你的...

    myeclipse、tomcat集成CAS

    尝试访问需要SSO保护的资源,确保能正确跳转到CAS服务器进行登录,并在验证后能返回到原始请求页面。 6. **扩展和优化**:CAS支持多种定制化选项,如自定义登录界面、单点登出、票证超时策略等。你可以根据实际需求...

    spring boot 集成kisso单点登入

    Spring Boot集成Kisso单点登录(SSO)是一个便捷的方法,可以为多个应用提供统一的登录体验。Kisso,作为一个轻量级的单点登录解决方案,相比CAS(Central Authentication Service)更为简洁,适用于小型项目或快速...

    cas4.2.7 实现其他系统和cas互相认证互信

    3. **集成CAS客户端库**:在外部系统中,需要集成CAS客户端库,如Java CAS Client、Spring Security CAS等,它们负责处理与CAS服务器的交互,包括重定向用户到CAS登录页面、接收和验证服务票证。 4. **配置客户端...

    spring-security-reference-4.0.1

    - **CAS (spring-security-cas.jar)**:支持使用 CAS 单点登录协议。 - **OpenID (spring-security-openid.jar)**:提供 OpenID 身份验证支持。 #### 二、Spring Security 4.0 新特性 ##### 2.1 新特性 Spring ...

    cas-client-core-3.3.3

    CAS协议通过代理票据(Proxy Ticket)和服务票据(Service Ticket)机制,确保用户只需要在CAS服务器上验证一次身份,之后便可以在已集成CAS的服务之间自由跳转,无需重复登录。这大大提高了用户体验,并增强了安全...

    单点登录cas参考

    文档中提到了许多常见问题及其解决方案,例如登录成功后跳转地址错误、业务系统间无法互相访问、客户端如何获取登录用户名、单点退出配置及注意事项、session超时分析和解决方案等。 #### 六、附录 文档最后提供了...

    CAS单点登录配置

    4. **客户端集成**:在每个需要SSO的应用中,集成CAS客户端库,如`spring-security-cas`,配置应用的`security.xml`或相应的安全配置,设置CAS服务器地址、服务验证URL以及票证校验逻辑。 5. **票证生成与验证**:...

    cas单点登录配置及资源

    - jar包:包含CAS服务器运行所需的库,如Apache HttpClient、Spring Security等。 - war包:CAS服务器本身,部署在Tomcat中,启动后提供认证服务。 7. **资源文档** - 配置文档:详细记录了配置CAS服务器和服务...

    单点登录解决方案1--暂时没有相关代码

    - 对于需要SSO功能的应用系统,需要在前端页面上实现跳转到CAS Server进行登录的功能。 - 用户登录成功后,CAS Server会生成一个Ticket,并通过重定向的方式返回给前端页面。前端页面再利用这个Ticket与各子系统...

    patch_20210113单点登录跳转主页显示白屏.zip

    如果NCCloud使用了Spring Security,那么白屏可能是因为认证过滤器没有正确配置,导致用户认证成功后未能跳转到预期的主页,或者是权限控制逻辑存在问题,阻止了页面的正常显示。 2. **CAS(Central Authentication...

    cas-client-3.1.12-release.tar.gz

    如果携带,它会使用TicketValidator进行验证,验证成功后创建Spring Security的Authentication对象,使用户获得授权。 4. **CasAssertionAuthenticationToken**: CAS认证令牌,用于封装经过验证的用户信息,供...

    java单点登录

    5. Spring Security集成:Spring Security是一个强大的安全框架,可与CAS集成,提供SSO功能。在Java应用中,通过配置Spring Security,可以轻松实现与CAS服务器的交互。 6. Eclipse工程配置:为了在Eclipse中运行...

Global site tag (gtag.js) - Google Analytics