单点登录配置

28 篇文章 1 订阅
2 篇文章 0 订阅

简单说一下实现单点登陆的方式。

第一: 使用cookie来做。拿到后端返回的cookies凭证,每次请求带上。比较常用的方式。

缺点有2个:安全性不高,cookies容易被人窃取。另一个就是不能跨域

第二:使用token,返回一个新的token来验证。后端返回一个token验证,请求的时候带上。缺点就是万一加密验证被获取了,也容易被人攻击。

第三:就是页面跳转。后端返回一个加密的token,跳转到子应用。缺点就是需要跳转,用户体验稍微差点。

我们采取一个比较特殊的方式,在react项目中,iframe上面使用postMessage去完成请求拿到token完成单点登陆。

直接贴代码了。

发送请求

const sendMessage = (frameId, originSrc, message) => {

let sendData = {

data: message,

i_token:window.localStorage.getItem(‘kp.token’)

};

let id = frameId ||0;

window.frames[id].postMessage(JSON.stringify(sendData), originSrc);

}

监听并且回复请求

const listenMessage = (source, message) => {
window.addEventListener(‘message’,function(event){
if (event.origin !== source)
return;
let data = {
msg: message,
i_token:window.localStorage.getItem(‘kp.token’)
}
event.source.postMessage(JSON.stringify(data), event.origin);
},false);
}
postMessage 并且不像http请求一样可以监听,所以不同类型的文件传输方式都没有经过检验,看文档上面目前只允许字符串类型。


前端单点登录原理:
1.SSO一般都需要一个独立的认证中心(passport),
2.子系统的登录均得通过passport,子系统本身将不参与登录操作,
3.当一个系统成功登录以后,passport将会颁发一个令牌给各个子系统,子系统可以拿着令牌会获取各自的受保护资源,
4.为了减少频繁认证,各个子系统在被passport授权以后,会建立一个局部会话,在一定时间内可以无需再次向passport发起认证。

存储token
cookie方式:setCookie设置顶级域名
localStorage方式:postmessage
接受:
window.addEventListener(“message”, (event)=>{
var origin = event.origin;
// 通常,onmessage()事件处理程序应当首先检测其中的origin属性,忽略来自未知源的消息
if (origin !== “http://example.org:8080”)
return;
// …
}, false);
vue localstorage跨域实现参考

如何实现SSO单点登录?
不同域名如何实现单点登录?比如:
天猫:www.tmall.com
淘宝: www.taobao.com
实现方式一:父域名cookie domain属性,必须blog.a.com. news.a.com 这种二级域名
实现方式二:认证中心CAS太麻烦
CAS(单点登录)
现象:多个系统只需登录一次,无需重复登录
原理:授权服务器,被授权客户端
1、授权服务器(一个)保存了全局的一份session,客户端(多个)各自保存自己的session
2、客户端登录时判断自己的session是否已登录,若未登录,则(告诉浏览器)重定向到授权服务器(参数带上自己的地址,用于回调)
3、授权服务器判断全局的session是否已登录,若未登录则定向到登录页面,提示用户登录,登录成功后,授权服务器重定向到客户端(参数带上ticket【一个凭证号】),设置过期时间,可以存到redis里
4、客户端收到ticket后,请求服务器获取用户信息,从redis里查询到相应的session
5、授权服务器同意客户端授权后,服务端保存用户信息至全局session,客户端将用户信息保存至本地session

实现方式三: local storage 跨域iframe+postMessage

低代码平台单点登录配置:
1.新增5个文件
utils/auth.js. utils/sso.js. utils/store.js.
premission.js.
api/login.js
其他修改如下:
在这里插入图片描述

2.具体修改内容截图
2.1 login.js
在这里插入图片描述
2.2 UserMenu.vue
在这里插入图片描述
在这里插入图片描述
2.3 router.config.js
在这里插入图片描述
在这里插入图片描述
2.4 user.js
在这里插入图片描述
在这里插入图片描述

2.5 auth.js
在这里插入图片描述
2.6 request.js
在这里插入图片描述
在这里插入图片描述

2.7 sso.js
在这里插入图片描述
2.8 store.js
在这里插入图片描述
2.9 premission.js
在这里插入图片描述
在这里插入图片描述

2.10 .env.development
在这里插入图片描述
2.11 vue.config.js
在这里插入图片描述

单点登录成功,获取到code和status
autologin
退出时,把code码带给后端

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端段

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值