项目使用cas的restful协议进行单点登录

一、为什么要使用restful协议

可以使用原本系统的登录界面,不用去改cas默认的界面。改实际的项目远比demo测试时复杂的多,我这里项目用的是springmvc

二、实现思路:

(1)调整cas服务端的配置文件可以参考springboot+shiro+cas5.2通过RESTful协议进行sso单点登录

(2)在原本的登录逻辑上添加登录成功后,通过用户名密码获取tgt的代码,并把tgt添加到session里

//利用restful协议登录cas服务端
String tgt = new CasServerUtil().getTGT(loginname, password);
if (StringUtils.isNotBlank(tgt)) {
    request.getSession().setAttribute("tgt", tgt);
    return "true";
}

(3)在js调用ajax返回成功的方法里,先把tgt存到cookie中,再调用获取ST(ticket)的方法,拿到ST后通过重定向登录成功

	/**
	 *
	 * @Date 2020年8月10日 下午4:57:05
	 * @Description 重定向
	 * @Fcunction redirect
	 * @return String
	 *
	 */
	@RequestMapping(value="redirect",method =RequestMethod.GET)
	public String redirect(HttpServletRequest request, HttpServletResponse response,String tgt){
		if (StringUtils.isBlank(tgt)) {
			tgt = (String) request.getSession().getAttribute("tgt");
			Cookie cookie = new Cookie("tgt", tgt);
			// 2.配置Cookie对象
			cookie.setComment("cas");    // Cookie描述
			cookie.setMaxAge(24 * 60 * 60);            // Cookie有效时间
			cookie.setPath("/");                 // Cookie有效路径
			// 3.通过response对象将Cookie写入浏览器,当然需要解决中文乱码问题,否则会抛出异常
			// java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value
			response.setCharacterEncoding("UTF-8");
			response.setContentType("text/html;charset=UTF-8");
			response.addCookie(cookie);
		}else {
			request.getSession().setAttribute("tgt", tgt);
		}
		String st = new CasServerUtil().getST(tgt);
		return "redirect:" + CommonConfigUtils.serverA + "shiro-cas?ticket=" + st;
	}

(4)现在单个系统已经能通过原本的登录页成功登录,并让cas服务端成功认证,且cookie中也有了tgt。接下来是修改拦截器,我这里项目原本的逻辑是,直接访问业务模块,会进拦截器,通过判断shiro有无登录用户,未登录则返回登录页面,登录了返回业务页面。这里给拦截器中未登录的的地方增加读取cookie中的tgt,把原有访问业务的地址存session中(避免后面登录成功返回首页),以及通过重定向登录

if (user != null) {//判断有用户登录时,进一步判断有没有相应的权限。
	fc.doFilter(req, resp);
	return;
} else {//没有登录用户时处理
	ShiroHttpServletRequest httpservletrequest = (ShiroHttpServletRequest) request;
	//获取cookie中的tgt
	Cookie[] cookies = httpservletrequest.getCookies();
	for (Cookie cookie : cookies) {
		String name = cookie.getName();
		if ("tgt".equals(name)) {
			String tgt = cookie.getValue();
			if (StringUtils.isNotBlank(tgt)) {
				//把原本访问业务的地址存到session中
				StringBuffer r
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值