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