当前位置:首页 > 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 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mi…

vue 实现递归

vue 实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据,例如菜单、评论列表或文件目录。以下是实现递归组件的关键步骤: 定义递归组件 递归组件需要设置 name 属性,以便在模…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue实现前端跳转

vue实现前端跳转

Vue 实现前端跳转的方法 在 Vue 中实现前端跳转通常使用 Vue Router,以下是几种常见的跳转方式: 声明式导航(模板中使用 <router-link>) 在模板中直接使用…

vue 左右滑动实现

vue 左右滑动实现

Vue 实现左右滑动功能 使用 Vue 实现左右滑动功能可以通过多种方式完成,常见的有基于原生 JavaScript 事件监听、第三方库(如 Hammer.js)或 Vue 专用插件(如 vue-to…

vue 实现获取焦点

vue 实现获取焦点

实现获取焦点的方法 在 Vue 中实现获取焦点可以通过多种方式完成,以下是几种常见的方法: 使用 ref 和 focus 方法 通过 ref 属性获取 DOM 元素,并调用其 focus 方法实现焦…