CAS(Central Authentication Service)是一个开源的单点登录协议和实现,它提供了一种统一的方法来管理和验证用户身份,使用户只需通过一次登录即可访问多个应用程序。CAS 单点登录的工作原理是基于服务提供者 (Service Provider) 和身份认Identity Provider) 的交互。
步骤流程
例如以网站1访问 ip为 192.168.1.201
1. 判断当前用户是否登录,如果没登录要跳转到登录服务器的ip上 并携带之前的地址 例如 192.168.1.110?service=192.168.1.201。
2. 在192.168.1.110输入账号密码 登录后会服务器会返回 票据 (ticket )用于请求token的变量 然后会重定向到网站1 192.168.1.201?ticket=xxxx。
3.用在url中的ticket去请求token,返回用户标识信息 完成单点登录。
以Vue为例,只需要在路由守卫中判断无token 跳转到登录页的流程替换掉跳转即可。
举例:
import { casServe } from '@/utils/url'router.beforeEach(async (to, from, next) => {const token = getToken(); // 获取token// 如果访问的是权限页面if (!freeList.includes(to.fullPath)) {if (token) {next();} else {// 单点登录 如果存在ticket 则去后台获取token 如果to可以拿到也可以用toif (window.location.href.includes('ticket')){ let ticket = ''const ticketArr = window.location.href.split('?')[1].split(['='])ticket = ticketArr[1].slice(0,-2)await store.dispatch('user/casLogin', { ticket, service: casServe })next('/')// 如果不存在ticket 则跳转到cas服务器登录} else { window.location.href = casServe + '/user/login?service=' + encodeURIComponent(window.location.origin)}// 非单点登录// next("/login");}}else if (token && freeList.includes(to.fullPath)) {next(from.fullPath);} else {next();}
});