手把手教Apereo CAS5.2.3 注册后自动登录

顺手贴上CAS 5.2.X官方文档:https://apereo.github.io/cas/5.2.x/index.html
hugeo的CAS系列:https://blog.csdn.net/u010588262/article/category/7548325
DEMO下载:
part1: https://download.csdn.net/download/u010588262/10327539
part2:https://download.csdn.net/download/u010588262/10372828

只要手头有用户名和密码就可以实现静默登录,就是不需要用户在登录页面输入信息,比如用户注册之后,你就知道用户名和密码了,就可以用restful的方式根据用户名和密码获得tgt,将tgt塞入cookie即可,大致过程是这样,下面详细说一下。

默认情况下CAS服务端校验用户身份后会生成tgt,类似这样的字符串:
TGT-1-e9OqKGuTlqMHrLgneGXYLc0fUTyz5DKZ09WpXjtochS-wohnm2syP4mZH2VAwLZ1nEI-LAPTOP-UVV0Q09C
然后使用DefaultCasCookieValueManagertgt加上客户端IP客户端代理信息后再加密,形成一个复杂的很长的串儿写入用户浏览器的cookie中取名TGC,这样用户每次访问服务端校验时会自动带着TGC,服务端收到了就解密校验了。

所以想要默默地单点登录就要默默地生成TGC放在cookie中。 两种方式实现

推荐方式

注意:此处假设你看过我之前的几篇博客了,或者说对CAS比较了解了的情况下,不会做详细解释

通过此方法,登录流程为:
1. 用户注册成功后,代码通过rest方式调服务端接口获得TGT(不知道怎么获取的请看下之前有一篇详细说rest接口验证的博客)
2. 302跳转到服务端/setcookie接口,这个接口需要我们自己开发,将用户要访问的客户端地址serviceUrl和第一步获得tgt传过去,服务端校验tgt并生成tgc放入cookie
3. 服务端302跳转到serviceURL,用户登录成功

具体方法:

新增生成cookie的类:

package com.hugeo.cas;

import org.apereo.cas.CipherExecutor;
import org.apereo.cas.web.support.CookieRetrievingCookieGenerator;
import org.apereo.cas.web.support.CookieValueManager;
import org.apereo.cas.web.support.DefaultCasCookieValueManager;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.CookieGenerator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HugeoCookieGenerator extends CookieGenerator {

    CookieValueManager cookieValueManager;

    public HugeoCookieGenerator(CookieRetrievingCookieGenerator generator,CipherExecutor executor) {
        super.setCookieName(generator.getCookieName());
        super.setCookiePath(generator.getCookiePath());
        this.setCookieDomain(generator.getCookieDomain());
        super.setCookieMaxAge(generator.getCookieMaxAge());
        super.setCookieSecure(generator.isCookieSecure());
        super.setCookieHttpOnly(generator.isCookieHttpOnly());

        cookieValueManager = new DefaultCasCookieValueManager(executor);
    }

    public void addCookie(String tgt) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        HttpServletResponse response = attributes.getResponse();
        String theCookieValue = this.cookieValueManager.buildCookieValue(tgt, request);
        super.addCookie(response, theCookieValue);
    }

}

随便找个configuration类把类定义为bean

@Autowired
CipherExecutor cookieCipherExecutor;

 @Autowired
 @Qualifier("ticketGrantingTicketCookieGenerator")
 private CookieRetrievingCookieGenerator generator;

 @Bean
 HugeoCookieGenerator hugeoCookieGenerator(){
     return new HugeoCookieGenerator(generator, cookieCipherExecutor);
 }

自己写个controller通过tgt生成cookie

@Autowired
@Qualifier("centralAuthenticationService")
private CentralAuthenticationService centralAuthenticationService;
@Autowired
HugeoCookieGenerator hugeoCookieGenerator;

@GetMapping("/setcookie")
public String setCookie(@RequestParam("service") String service, @RequestParam("tgt") String tgt) {
     try {
         // 校验
         Ticket ticket = this.centralAuthenticationService.getTicket(tgt, Ticket.class);
         if (ticket == null || ticket.isExpired()) {
             // 无效tgt,跳转到登录
             return "redirect:/login";
         }
         // 添加cookie
         hugeoCookieGenerator.addCookie(tgt);
         // 跳转到客户端
         return "redirect:" + service;
     } catch (Exception e) {
         e.printStackTrace();
     }
     return "redirect:/login";
 }

简单方式(安全性有降低)

之前的restful博客中写了怎么通过接口获得tgt,现在问题是怎么通过tgt获得tgc呢,网上查资料发现tgt除了默认的加密生成方式外,还有一种就是NoOpCookieValueManager,这种方式就是直接返回tgt,也就是说tgctgt是一模一样的,CAS是这样判断的:
这里写图片描述
关键词:properties,tgc,crypto

所以到官方文档中找相应的配置,把tgc的crypto关闭

https://apereo.github.io/cas/5.2.x/installation/Configuration-Properties.html
需要翻一下wall

搜索tgc很容易就找到了:
这里写图片描述
所以我们在配置文件application.properties中加上:

# 不要加密tgt
cas.tgc.crypto.enabled=false

但是这样做有弊端就是安全性有所降低,之前加密的方式使得tgt客户端ipagent绑定,而现在不加密的方式使得生成的tgt可以被任何客户端和IP使用。当然这也是最简单的方法。

然后我开始测试了,测试思路是:
1. 使用postman调接口获得tgt。相当于是用户注册成功后,你用代码调接口获得tgt
2. 把tgt放到cookie中。我此处是直接在chrome浏览器中通过edit this cookie插件实现的,相当于在代码中setCookie,注意要设置cookie的domain为CAS服务器端的地址,这样客户端重定向到服务端进行校验时才会带着这个cookie。
这里写图片描述

这里写图片描述

这里写图片描述

此时访问客户端即为登录状态了

此篇参考了文章:https://blog.csdn.net/cn_yh/article/details/77962467

猜你喜欢

转载自blog.csdn.net/u010588262/article/details/80215662