Vue-Element-Admin前端接入SSO的方法步驟
概要
相信很多像我一樣初入門前端的時(shí)候,都是基于某個(gè)模板來學(xué)。 vue-element-admin 或者 vue-element-template是一個(gè)很好的模板。而在后期,一般公司都會(huì)要求接入SSO, 作者覺得這個(gè)太簡(jiǎn)單了,都是后臺(tái)的工作,前端 只需判斷后臺(tái)返回的token或者其他信息就可以,所以在相關(guān)文檔中也沒有太多提及。相信仍有一部分人無從下手,所以在這里重新記錄一下。
SSO
至于如果搭建SSO,這里不說,自行搜索。
我們用的SSO是基于: Apereo Central Authentication Service 5.3.9
假設(shè)搭建好的SSO地址是: https://sso.ekin.com
前端頁(yè)面
基于vue-element-admin前端頁(yè)面默認(rèn)地址:http://localhost:9528
如果你用的是windows,可以更改hosts文件: 127.0.0.1 test.ekin.com,
這樣前端頁(yè)面地址是:http://test.ekin.com:9528
1. config.js文件
這個(gè)文件放于src/config/sysConfig.js,內(nèi)容很簡(jiǎn)單,是兩個(gè)地址:
'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://[后臺(tái)服務(wù)地址]/user/token?userCode=${user_id}`) ? ? //返回的結(jié)構(gòu)大概想這樣: ? ? // 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權(quán)限 ? ? ? ? ? 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]: '' ? ? ? ? } ? ? ? }, ? ? ? //這個(gè)是我們加的 ? ? ? '/cas/serviceValidate': { ? ? ? ? target: "https://sso.ekin.com", ? ? ? ? changeOrigin: true, ? ? ? ? pathRewrite: { ? ? ? ? ? '/cas': '' ? ? ? ? } ? ? ? } ? ? }, ? ? after: require('./mock/mock-server.js') ? },
5. 運(yùn)行
這時(shí)應(yīng)該就可以請(qǐng)求http://test.ekin.com:9528,然后會(huì)跳轉(zhuǎn)的sso登陸頁(yè)面,輸入你的域帳號(hào)就能正常加載出網(wǎng)站頁(yè)面。
上面涉及到的兩個(gè)接口,是需要后臺(tái)提供的:
- getUserByUserId
- getUserRoles
但這兩個(gè)不想麻煩合并成一個(gè)就可以了,或者直接Mock數(shù)據(jù)返回就可以
到此這篇關(guān)于Vue-Element-Admin前端接入SSO的方法步驟的文章就介紹到這了,更多相關(guān)Vue-Element-Admin接入SSO內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vuex實(shí)現(xiàn)數(shù)據(jù)狀態(tài)持久化
今天小編就為大家分享一篇vuex實(shí)現(xiàn)數(shù)據(jù)狀態(tài)持久化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Vue ElementUI中el-table表格嵌套樣式問題小結(jié)
這篇文章主要介紹了Vue ElementUI中el-table表格嵌套樣式問題小結(jié),兩個(gè)表格嵌套,當(dāng)父表格有children數(shù)組時(shí)子表格才展示,對(duì)Vue ElementUI中el-table表格嵌套樣式問題感興趣的朋友跟隨小編一起看看吧2024-02-02VUE動(dòng)態(tài)生成word的實(shí)現(xiàn)
這篇文章主要介紹了VUE動(dòng)態(tài)生成word的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue3+vueuse實(shí)現(xiàn)放大鏡示例詳解
這篇文章主要為大家介紹了Vue3+vueuse實(shí)現(xiàn)放大鏡示例過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07