Vue-Element-Admin前端接入SSO的方法步驟
概要
相信很多像我一樣初入門前端的時(shí)候,都是基于某個(gè)模板來學(xué)。 vue-element-admin 或者 vue-element-template是一個(gè)很好的模板。而在后期,一般公司都會(huì)要求接入SSO, 作者覺得這個(gè)太簡單了,都是后臺(tái)的工作,前端 只需判斷后臺(tái)返回的token或者其他信息就可以,所以在相關(guān)文檔中也沒有太多提及。相信仍有一部分人無從下手,所以在這里重新記錄一下。
SSO
至于如果搭建SSO,這里不說,自行搜索。
我們用的SSO是基于: Apereo Central Authentication Service 5.3.9
假設(shè)搭建好的SSO地址是: https://sso.ekin.com
前端頁面
基于vue-element-admin前端頁面默認(rèn)地址:http://localhost:9528
如果你用的是windows,可以更改hosts文件: 127.0.0.1 test.ekin.com,
這樣前端頁面地址是:http://test.ekin.com:9528
1. config.js文件
這個(gè)文件放于src/config/sysConfig.js,內(nèi)容很簡單,是兩個(gè)地址:
'use strict'
var sysConfig = {
?? ?//sso address
? casServerUrl: "https://sso.ekin.com",
? //frontend address
? sysDomain: "http://test.ekin.com:9528"
}
module.exports = sysConfig2. 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登陸頁面,輸入你的域帳號(hào)就能正常加載出網(wǎng)站頁面。
上面涉及到的兩個(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)文章
Vue項(xiàng)目設(shè)置多個(gè)靜態(tài)文件及自定義靜態(tài)文件目錄的方案詳解
本文介紹了如何在Vue項(xiàng)目中配置多個(gè)靜態(tài)文件目錄,并提供了使用Vite和Webpack實(shí)現(xiàn)的示例,通過在vite.config.ts或vue.config.js中引入相關(guān)插件和配置,可以輕松實(shí)現(xiàn)自定義靜態(tài)文件目錄,希望這些內(nèi)容對(duì)您有所幫助,感興趣的朋友一起看看吧2025-01-01
Vue項(xiàng)目的網(wǎng)絡(luò)請(qǐng)求代理到封裝步驟詳解
這篇文章主要介紹了Vue項(xiàng)目的網(wǎng)絡(luò)請(qǐng)求代理到封裝步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
vue修飾符v-model及.sync原理及區(qū)別詳解
這篇文章主要為大家介紹了vue修飾符v-model及.sync原理及使用區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
vue2+elementui進(jìn)行hover提示的使用
本文主要介紹了vue2+elementui進(jìn)行hover提示的使用,主要分為外部和內(nèi)部,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11
vue2安裝vue-router報(bào)錯(cuò)的解決方法
vue-router的安裝不是理想化的,會(huì)出現(xiàn)問題,需要靜下心認(rèn)真研究,熬過去就會(huì)懂得更多,這篇文章主要給大家介紹了關(guān)于vue2安裝vue-router報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2022-03-03
15 分鐘掌握vue-next函數(shù)式api(小結(jié))
這篇文章主要介紹了15 分鐘掌握vue-next函數(shù)式api(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
淺談Vue3.0新版API之composition-api入坑指南
這篇文章主要介紹了Vue3.0新版API之composition-api入坑指南,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

