当前位置:首页 > 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 并重定向到子系统:

    // 主系统登录逻辑
    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 回调:

    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 集中管理认证状态

示例路由守卫实现:

vue单点登录实现

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

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

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

相关文章

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

vue实现tabs

vue实现tabs

Vue实现Tabs组件的方法 使用动态组件和v-for指令 在Vue中创建Tabs组件可以通过动态组件和v-for指令实现。定义一个包含tab标题和内容的数组,使用v-for渲染tab标题,并通过点击…

mui实现vue

mui实现vue

mui 实现 Vue 的步骤 mui 是一个轻量级的前端框架,常用于移动端开发。结合 Vue 可以实现高效的开发体验。以下是具体实现方法。 安装 mui 和 Vue 通过 npm 或 yarn 安装…