当前位置:首页 > VUE

vue单点登录实现

2026-02-17 12:57:06VUE

Vue 单点登录实现方案

单点登录(SSO)允许用户通过一次登录访问多个关联系统。以下是基于 Vue 的实现方案:

使用 OAuth2.0/OpenID Connect 协议

  1. 配置认证服务器
    选择 Keycloak、Auth0 或阿里云 IDaaS 等 SSO 服务提供商,注册应用并获取 client_idclient_secret
    示例配置:

    // auth.config.js
    export default {
      issuer: 'https://your-sso-server.com',
      clientId: 'your-client-id',
      redirectUri: window.location.origin + '/callback'
    }
  2. 集成 oidc-client-js 库
    安装并初始化认证库:

    npm install oidc-client-js
    // auth.js
    import { UserManager } from 'oidc-client-js';
    import config from './auth.config';
    
    const userManager = new UserManager(config);
    
    export const login = () => userManager.signinRedirect();
    export const logout = () => userManager.signoutRedirect();
  3. 处理回调页面
    创建 /callback 路由组件处理登录响应:

    // Callback.vue
    mounted() {
      userManager.signinRedirectCallback()
        .then(user => {
          localStorage.setItem('sso_token', user.access_token);
          this.$router.push('/');
        });
    }

基于 JWT 的跨域方案

  1. 主系统登录后分发 Token
    主系统登录成功后生成 JWT 并重定向到子系统:

    vue单点登录实现

    // 主系统登录逻辑
    const token = generateJWT(userInfo);
    window.location.href = `https://sub-system.com?token=${token}`;
  2. 子系统验证 Token
    子系统通过 created 钩子验证 Token:

    created() {
      const token = this.$route.query.token;
      if (token && validateJWT(token)) {
        axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
      } else {
        window.location.href = 'https://main-system.com/login';
      }
    }

使用 CAS 协议

  1. 重定向到 CAS 服务器
    未登录时跳转至 CAS 登录页:

    checkLogin() {
      if (!this.$store.state.isLoggedIn) {
        const service = encodeURIComponent(window.location.href);
        window.location.href = `https://cas-server.com/login?service=${service}`;
      }
    }
  2. 验证 ST(Service Ticket)
    在路由守卫中处理 CAS 回调:

    vue单点登录实现

    router.beforeEach((to, from, next) => {
      if (to.query.ticket) {
        axios.post('/validate-ticket', { ticket: to.query.ticket })
          .then(() => next('/'));
      }
    });

共享 Cookie 方案(同父域)

  1. 设置跨域 Cookie
    主域 .example.com 设置 Cookie:

    document.cookie = `sso_token=${token}; domain=.example.com; path=/`;
  2. 子域检测 Cookie
    子域通过后端接口验证 Cookie:

    mounted() {
      axios.get('/api/verify-sso')
        .catch(() => window.location.href = 'https://sso.example.com');
    }

注意事项

  • 所有敏感操作需后端二次验证
  • Token 应设置合理有效期
  • 采用 HTTPS 保证传输安全
  • 实现全局路由守卫检查认证状态
  • 考虑使用 Vuex 集中管理认证状态

示例路由守卫实现:

router.beforeEach((to, from, next) => {
  const isAuthenticated = store.getters.isAuthenticated;
  if (to.meta.requiresAuth && !isAuthenticated) {
    next('/login');
  } else {
    next();
  }
});

以上方案可根据实际业务需求组合使用,建议优先选择标准协议如 OAuth2.0。

标签: 单点vue
分享给朋友:

相关文章

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginate…

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

实现vue cli

实现vue cli

安装 Vue CLI 确保系统中已安装 Node.js(版本建议 12.x 或更高)。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 安装完成后验证版本:…