Vue-Element-Admin前端接入SSO的方法步骤
作者:kielin 发布时间:2023-07-02 16:57:19
概要
相信很多像我一样初入门前端的时候,都是基于某个模板来学。 vue-element-admin 或者 vue-element-template是一个很好的模板。而在后期,一般公司都会要求接入SSO, 作者觉得这个太简单了,都是后台的工作,前端 只需判断后台返回的token或者其他信息就可以,所以在相关文档中也没有太多提及。相信仍有一部分人无从下手,所以在这里重新记录一下。
SSO
至于如果搭建SSO,这里不说,自行搜索。
我们用的SSO是基于: Apereo Central Authentication Service 5.3.9
假设搭建好的SSO地址是: https://sso.ekin.com
前端页面
基于vue-element-admin前端页面默认地址:http://localhost:9528
如果你用的是windows,可以更改hosts文件: 127.0.0.1 test.ekin.com,
这样前端页面地址是:http://test.ekin.com:9528
1. config.js文件
这个文件放于src/config/sysConfig.js,内容很简单,是两个地址:
'use strict'
var sysConfig = {
//sso address
casServerUrl: "https://sso.ekin.com",
//frontend address
sysDomain: "http://test.ekin.com:9528"
}
module.exports = sysConfig
2. SSO.js文件
放于前端目录:src/utils/sso.js
import x2js from 'x2js'
import axios from 'axios'
const sysConfig = require('@/config/sysConfig')
import {
getToken,
setToken
} from '@/utils/auth'
import store from '../store'
import router from '../router'
const casServerUrl = sysConfig.casServerUrl
const sysDomain = sysConfig.sysDomain
const casLoginUrl = `${casServerUrl}/login`
export default {
enableCasAuth() {
const token = getToken()
if (token) {
return
}
if (this.isCasCallback()) {
const ticket = this.getTicket()
this.getAuthInfo(ticket).then(res => {
debugger
if (res.success) {
const user_id = res.username.__text
localStorage.setItem('name', user_id)
this.login(user_id)
} else {
this.toAuth()
}
})
} else {
this.toAuth()
}
},
toAuth() {
location.href = `${casLoginUrl}?service=${sysDomain}`
},
toIndex(path) {
location.href = sysDomain + '/#/' + path
},
getTicket() {
var reg = new RegExp('(^|&)ticket=([^&]*)(&|$)', 'i')
var r = window.location.search.substr(1).match(reg)
if (r != null) return unescape(r[2])
return null
},
getAuthInfo(ticket) {
return axios.get(`/cas/serviceValidate?service=${sysDomain}&ticket=${ticket}`).then(res => {
debugger
const x2j = new x2js()
var info = x2j.xml2js(res.data)
if (info.serviceResponse.authenticationSuccess) {
return {
'success': true,
'username': info.serviceResponse.authenticationSuccess.user
}
} else {
return {
'success': false,
'username': ''
}
}
})
},
isCasCallback() {
const url = window.location.href
return url.indexOf(sysDomain + '/?ticket=') != -1
},
logout() {
location.href = `${casServerUrl}/logout?service=${sysDomain}`
},
getUserByUserId(user_id) {
return axios.post(`http://[后台服务地址]/user/token?userCode=${user_id}`)
//返回的结构大概想这样:
// let data = {
// code: 1,
// token: 'admin-token'
// }
},
login(user_id) {
this.getUserByUserId(user_id)
.then(async (response) => {
const data = response.data
if (data.code === 1) {
setToken(data.token)
var token = data.token
axios.defaults.headers.common['token'] = getToken()
store.commit('user/SET_TOKEN', token)
// const {
// roles
// } = await store.dispatch('user/getInfo')
//为了方便,直接给予ADMIN权限
let roles = ['ADMIN']
const accessRoutes = store.dispatch('permission/generateRoutes', roles)
router.addRoutes(accessRoutes)
} else {
router.push({
path: '/401'
})
}
})
}
}
3. 修改permission.js文件
引入sso.js
import cas from '@/utils/sso'
更改router.beforeEach
router.beforeEach(async (to, from, next) => {
// start progress bar
NProgress.start()
// set page title
document.title = getPageTitle(to.meta.title)
// determine whether the user has logged in
const hasToken = getToken()
if (hasToken) {
// cut for breif
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
// next(`/login?redirect=${to.path}`)
// NProgress.done()
cas.enableCasAuth();
next();
NProgress.done();
}
}
})
4. 修改vue.config.js文件
devServer: {
port: port,
open: true,
disableHostCheck: true,
overlay: {
warnings: false,
errors: true
},
proxy: {
// change xxx-api/login => mock/login
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://127.0.0.1:${port}/mock`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
//这个是我们加的
'/cas/serviceValidate': {
target: "https://sso.ekin.com",
changeOrigin: true,
pathRewrite: {
'/cas': ''
}
}
},
after: require('./mock/mock-server.js')
},
5. 运行
这时应该就可以请求http://test.ekin.com:9528,然后会跳转的sso登陆页面,输入你的域帐号就能正常加载出网站页面。
上面涉及到的两个接口,是需要后台提供的:
getUserByUserId
getUserRoles
但这两个不想麻烦合并成一个就可以了,或者直接Mock数据返回就可以
来源:https://blog.csdn.net/kielin/article/details/107714953


猜你喜欢
- 目前搜索到的方法有:np.where(‘元素')还有就是pandas的方法:df.index(‘元素')但是第二个方法的问题
- 一、漏洞描述该漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆盖,以至
- 1 Scala 安装 1.1 Windows(1)安装 Java进入网址 https://www.oracle.com/
- window对文件夹的操作主要包括移动/剪切/复制,本篇文章主要用jQuery来实现,下面一起来了解一下把。1.先看下效果吧!2.在添加一个
- 第一种--对象键值去重Array.prototype.unique1 = function () { var r
- 环境 MySQL 5.1 + 命令行工具 问题 MySQL表字段设置默认值 解决 --SQL: CREATE TABLE test( i_a
- 目录一:搭建webpack二:数据劫持三:总结一:搭建webpack简单的搭建一下webpack的配置。新建一个文件夹,然后init一下。之
- 引言善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的,同样,ChatGPT后台Api接口请求中,如果将Stream参数
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 近期,MSN、江民等知名网站相继受到了黑客的威胁和攻击,一时间网络上风声鹤唳。本报编辑部接到本文作者(炽天使)的电话,他详细讲述了发现国内最
- 创建python文件fling.py,代码如下:#!/usr/bin/env monkeyrunnerimport timefrom com
- 本文实例讲述了Sanic框架请求与响应。分享给大家供大家参考,具体如下:前面介绍了Sanic框架的路由,这里接着介绍Sanic框架的请求与响
- PyQt5是强大的GUI工具之一,通过其可以实现优秀的桌面应用程序。希望通过一个简单的登录页面可以让大家顺利入坑,如有不妥之处还请大佬指点改
- 在最古老的JavaScript浏览器里注册事件只能通过内联模式。自从DHTML从根本上改变了你操作页面的方法,事件的注册就必须有扩展性而且要
- 提叻一个代码段,要人帮助解释一下。代码如下:declare type t_indexby is ta
- 根据微软论坛作者的英文解释,.NET framework 4.0 安装失败回滚貌似是因为“msvcr100_clr0400.d
- PHP attributes() 函数实例返回 XML 的 body 元素的属性和值:<?php $note=<<<
- DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。一、管理用户1、创建用户
- 这篇文章主要介绍了python使用enumerate获取迭代元素下标,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 微信小程序官方是没有提供退出的API的,但是在navigator这个组件中,是有退出这个功能的:详情参考官方文档:navigator。示例代