# SaToken统一认证登录服务端 **Repository Path**: YzsadASAS/satoken-multisystemauthenticationlogin ## Basic Information - **Project Name**: SaToken统一认证登录服务端 - **Description**: Satoken结合oauth实现第三方登录,有些问题还需完善 - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2022-12-30 - **Last Updated**: 2025-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SaToken统一认证登录服务端 #### 介绍 该项目使用SaToken结合oauth2.0授权码模式实现平台的统一认证登录(第三方登录)。 #### 软件架构 **1、Sa-Token** **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权** 等一系列权限相关问题。 **2、Oauth2.0四种模式** 基于不同的使用场景,OAuth2.0设计了四种模式: 1. 授权码(Authorization Code):OAuth2.0标准授权步骤,Server端向Client端下放Code码,Client端再用Code码换取授权Token 2. 隐藏式(Implicit):无法使用授权码模式时的备用选择,Server端使用URL重定向方式直接将Token下放到Client端页面 3. 密码式(Password):Client直接拿着用户的账号密码换取授权Token 4. 客户端凭证(Client Credentials):Server端针对Client级别的Token,代表应用自身的资源授权 #### 项目说明 1. 数据库的数据信息 通过项目中satokenauthentication.sql文件进行创建数据库、数据表以及数据。 本项目数据库主要分为三部分: ①用户信息:主要包含用户的基础信息,例如:姓名,电话等等 ②用户权限:该部分采用总分结构,获取用户权限的时候,先从authority数据表中获取相关信息,如字段为part则需要去对应字段的数据表中获取详细权限信息,表明用户身份拥有该字段系统功能的部分权限。 ③客户端信息:主要包含客户端的基础信息,例如:客户端id,客户端密钥等等 2. 统一认证登录流程 ①获取code授权码: 访问地址为: ``` http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=ZH&redirect_uri=http://sa-oauth-client.com:8002/&scope=userinfo ``` 其中: response_type=code,代表着oauth2.0的授权码模式,可进行更改response_type参数使用其他模式,本项目仅可使用授权码模式。 client_id=ZH为客户端的id参数。 redirect_uri=http://sa-oauth-client.com:8002/为重定向地址,即用户登录授权后,给客户端返回code的地址。 scope=userinfo为客户端申请的权限,需要用户进行确认授权。 ②获取access_token: 访问地址为: ``` http://sa-oauth-server.com:8001/oauth2/token?grant_type=authorization_code&client_id=ZH&client_secret=123456&code=步骤①中获取到的code ``` 其中: grant_type=authorization_code,代表着oauth2.0的授权码模式,可进行更改grant_type参数使用其他模式,本项目仅可使用授权码模式。 client_id=ZH为客户端的id参数。 client_secret=123456为客户端的密钥。 code为步骤①中获取到的code。 ③携带access_token获取用户的信息,通过access_token获取登录的用户Id,然后使用该id进行获取相关的信息。在使用access_token获取登录的用户Id过程中也就包含了核验access_token的工作内容。 例如: 获取用户身份基本信息 ``` http://sa-oauth-server.com:8001/oauth2/userinfo?access_token={value} ``` 获取用户权限 ``` http://sa-oauth-server.com:8001/oauth2/userauth?access_token={value} ``` 3、用户注册 访问下面的链接,填写需要的参数 链接: ``` http://sa-oauth-server.com:8001/register ``` 所需参数: ``` String username :用户名 String password :密码 String school :学校 String college :学院 String identity :身份 String name :姓名 int sex :性别 String phone :手机号 String email :邮箱 ``` 此部分设置核验手机号,需正确填写,主要代码如下: ``` public boolean isValidPhoneNumber(String phoneNumber) { if ((phoneNumber != null) && (!phoneNumber.isEmpty())) { return Pattern.matches("^1[3-9]\\d{9}$", phoneNumber); } return false; } ``` 4、用户权限获取 通过authority数据表中获取相关各个功能的信息,如果该用户在某一个功能中只具有部分权限,则该功能的字段信息为part,需要进一步去对应功能字段的数据表中获取详细权限信息,然后进行相应的返回数据。如果该用户具备某一功能的全部权限则该部分功能的字段信息为:功能字段名.*。 5、用户登录 在用户登录时,除去正常验证的用户的用户名密码等内容之外,增加了同端互斥登录的功能,通过获取请求登录的request中的User-Agent信息,进行相应的设备匹配,简单分为移动设备与PC设备两部分,主要代码如下: ``` public class EquipmentConfigure { private final static String[] agent = {"Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser"}; //定义移动端请求的所有可能类型 /** * 判断User-Agent 是不是来自于手机 * * @param ua * @return */ public boolean checkAgentIsMobile(String ua) { boolean flag = false; if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) { // 排除 苹果桌面系统 if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) { for (String item : agent) { if (ua.contains(item)) { flag = true; break; } } } } return flag; } } ``` 6、存在问题 ①用户登录,使用链接写死了,后期需要进行更改制作界面把这部分完成。 ②用户信息修改部分,还未完成,需要等子系统完成,配合一下。 ③OpenId的使用还不是很清楚,后期还得问问学长。