我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue-Element-Admin前端接入SSO的方法步骤

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue-Element-Admin前端接入SSO的方法步骤

概要

相信很多像我一样初入门前端的时候,都是基于某个模板来学。 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文件

这个文件放于class="lazy" data-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文件

放于前端目录:class="lazy" data-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 {
    

    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数据返回就可以

到此这篇关于Vue-Element-Admin前端接入SSO的方法步骤的文章就介绍到这了,更多相关Vue-Element-Admin接入SSO内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue-Element-Admin前端接入SSO的方法步骤

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue-element-admin项目导入和导出的实现方法

这篇文章给大家分享的是有关vue-element-admin项目导入和导出的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue-element-admin导入组件封装模板和样式首先封装一个类似的组件,首
2023-06-15

前端vue+element使用SM4国密加密解密的方法是什么

这篇文章主要讲解了“前端vue+element使用SM4国密加密解密的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“前端vue+element使用SM4国密加密解密的方法是什么”吧
2023-07-05

vue项目使用node连接数据库的方法(前后端分离)

这篇文章主要介绍了vue项目使用node连接数据库(前后端分离),本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-22

springboot vue前后端接口测试树结点添加功能的方法

这篇文章主要讲解了“springboot vue前后端接口测试树结点添加功能的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot vue前后端接口测试树结点添加功能的方法
2023-06-30

编程热搜

目录