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可以拿到也可以用to
if (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();
}
});