CAS单点登录返回除ticket之外的其他参数

前言

由于公司项目采用cas+shiro实现的单点登录,导致登录超时之后重新经过cas登录后无法返回之前页面的问题,参考文章CAS登录后回传除了ticket参数以外的其他自定义参数

重写SimpleWebApplicationServiceImpl与CasArgumentExtractor类

重写SimpleWebApplicationServiceImpl类,重载getResponse方法

public Response getResponse(String ticketId) {
        Map<String, String> parameters = new HashMap();
        if (StringUtils.hasText(ticketId)) {
            parameters.put("ticket", ticketId);
        }

        return Response.ResponseType.POST == this.responseType ? Response.getPostResponse(this.getOriginalUrl(), parameters) : Response.getRedirectResponse(this.getOriginalUrl(), parameters);
    }

    public Response getResponse(String ticketId, String arg) {
        Map<String, String> parameters = new HashMap();
        if (StringUtils.hasText(ticketId)) {
            parameters.put("ticket", ticketId);
        }
        if (StringUtils.hasText(arg)) {
            parameters.put("reBackUrl", arg);
        }else{
            RequestContext requestContext = RequestContextHolder.getRequestContext();

            HttpServletRequest httpServletRequest = WebUtils.getHttpServletRequest(requestContext);
            String reBackUrl= httpServletRequest.getParameter("reBackUrl");
            if (StringUtils.hasText(reBackUrl)) {
                parameters.put("reBackUrl", reBackUrl);
            }
        }

重写CasArgumentExtractor类,返回自定义的SimpleWebApplicationServiceImpl类

public class CasArgumentExtractor extends AbstractArgumentExtractor {
    public CasArgumentExtractor() {
    }

    public WebApplicationService extractServiceInternal(HttpServletRequest request) {
        return SimpleWebApplicationServiceImpl.createServiceFrom(request);
    }
}

自定义AuthenticationHandler类里,将cas客户端传过来的url保存

项目继承的AbstractUsernamePasswordAuthenticationHandler类实现的自定义登陆
保存url

requestContext.getFlowScope().put("service", service);
		String reBackUrl= request.getParameter("service");
		requestContext.getFlowScope().put("reBackUrl",reBackUrl);

在下面配置文件会用到

修改配置文件(保密需要隐藏类地址)

uniqueIdGenerators.xml里将系统类修改为自定义类:

<util:map id="uniqueIdGeneratorsMap">
		<entry
			key="com.*.*.*.*.SimpleWebApplicationServiceImpl"
			value-ref="serviceTicketUniqueIdGenerator" />
	</util:map>

argumentExtractorsConfiguration.xml同样处理

<bean
 		id="casArgumentExtractor"
 		class="com.*.*.*.*.CasArgumentExtractor" />

login-webflow.xml修改使用重载的getResponse方法

<action-state id="redirect">
        <evaluate expression="flowScope.service.getResponse(requestScope.serviceTicketId,flowScope.reBackUrl)" result-type="org.jasig.cas.authentication.principal.Response" result="requestScope.response" />
        <transition to="postRedirectDecision" />
    </action-state>

这样在重定向到客户端时将会带上两个参数****/shiro-cas?ticket=XXXX&reBackUrl=XXXX

cas客户端修改登录后默认页面

自定义CasLoginFilter 继承CasFilter,重写onLoginSuccess方法

@Override
	protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
			ServletResponse response) throws Exception {
		String reBackUrl= request.getParameter("reBackUrl");
		if (StringUtils.hasText(reBackUrl)) {
			this.setSuccessUrl(reBackUrl);
		}
		return super.onLoginSuccess(token, subject, request, response);
	}

没有reBackUrl则使用配置的固定url。
另外跳转cas登录时需要将要跳转的url带过去,cas?service=XXXXX

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值