一、为什么要使用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