# 单点登录

# 概述

本文档旨在介绍如何实现单点登录(SSO),使用户在多个系统中只需登录一次即可访问其他系统。其中涉及后端采用 sa-token 框架,前端使用 Vue3 框架进行集成,并且在 Spring Boot 工程中使用了 @EnableInfraSsoApi 注解以启用基础设施的单点登录相关的 API。

# 你将获取

  • 单点登录的实施方法和配置说明
  • 前端和后端的代码示例
  • 多个系统之间的身份认证和会话管理说明

# 后端集成配置

在 Spring Boot 的 application.yml(或 application.properties)文件中添加 sa-token 的配置,示例如下:

# sa-token配置
sa-token:
  token-name: satoken
  host-path: http://alinesno-infra-base-identity-auth-application.beta.base.infra.linesno.com
  sso:
    auth-url: ${sa-token.host-path}/login
    is-http: true
    check-ticket-url: ${sa-token.host-path}/sso/checkTicket
    slo-url: ${sa-token.host-path}/sso/signout
    get-data-url: ${sa-token.host-path}/sso/getData
  sign:
    secret-key: [your_secret_key_here]

在启动类上添加 @EnableInfraSsoApi 注解以启用基础设施的单点登录相关的 API,示例如下:

@EnableInfraSsoApi
@SpringBootApplication
public class BaseWorkflowApplication {

    public static void main(String[] args) {
        SpringApplication.run(BaseWorkflowApplication.class, args);
    }

}

确保 @EnableInfraSsoApi 注解所引用的 InfraSsoApiConfiguration 类中包含了单点登录相关的配置和逻辑。

# 前端集成示例

以下是一个基于 Vue3 的前端组件代码示例,用于处理单点登录流程。

<template>
  <div>
    <!-- SSO登录页面内容 -->
    <p>这是一个SSO登录页面</p>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import router from '@/router'
import useUserStore from '@/store/modules/user'
import { setToken } from '@/utils/auth'
import { getParam } from '@/utils/ruoyi'

// 定义变量
const isLogin = ref(false)
const back = getParam('back') || router.currentRoute.value.query.back
const ticket = getParam('ticket') || router.currentRoute.value.query.ticket

// 检查用户登录状态
useUserStore().isSsoLogin().then((res) => {
  isLogin.value = res.data
})

// 页面加载后执行
onMounted(() => {
  if (ticket) {
    doLoginByTicket(ticket)
  } else {
    goSsoAuthUrl()
  }
})

// 重定向至认证中心进行登录
function goSsoAuthUrl() {
  const clientLoginUrl = `${location.origin}/sso/login?back=${encodeURIComponent(location.href)}`

  useUserStore().goSsoAuthUrl(clientLoginUrl).then((res) => {
    location.href = res.data
  })
}

// 使用ticket值进行登录
function doLoginByTicket(ticket) {
  useUserStore().doLoginByTicket(ticket).then((res) => {
    localStorage.setItem('satoken', res.data)
    setToken(res.adminToken)
    location.href = decodeURIComponent(back)
  })
}
</script>

# 注意事项

  • 前端代码中的示例是一个简化的单点登录页面的 Vue3 组件。建议根据实际情况进行适当的调整和修改,包括注释、错误处理以及安全措施等。
  • 单点登录的成功与否会影响用户体验和安全性,请确保代码的稳健性和安全性。