基于OAuth2协议的SSO统一认证系统

1. 总体设计

1.1 概述

单点登录(SSO)是一种身份验证和授权机制,允许用户使用一组凭据(例如用户名和密码)登录到多个应用程序或系统中,而无需为每个应用程序输入不同的凭据。这种机制提高了用户体验,简化了身份验证和授权的过程,减少了密码管理的负担,提高了安全性。
目前市场上有多种SSO解决方案,包括基于标准协议的解决方案(如SAML、OAuth、OpenID Connect)和专有协议的解决方案。经过对比,我们的SSO采用目前主流的OAuth2解决方案,在安全性,可扩展性、互操作性方面都有显著优点。

1.2 IDP与SP

在单点登录(SSO)中,有两个重要的角色:服务提供者(Service Provider,SP)和身份提供者(Identity Provider,IDP)。下面对它们进行简要说明:

服务提供者(Service Provider,SP):服务提供者是提供服务的应用程序或系统。在SSO中,SP会向身份提供者发起身份验证请求,以验证用户的身份信息。如果验证成功,SP会授予用户访问其服务的权限。

身份提供者(Identity Provider,IDP):身份提供者是管理用户身份信息的系统。在SSO中,IDP负责验证用户的身份信息,并在验证成功后向SP颁发安全令牌,以证明用户已经通过身份验证。SP可以使用该安全令牌来授予用户访问其服务的权限。

1.3 设计目标

基于OAuth2协议,打造一套安全、便捷、经济、可靠的身份验证和授权系统,主要目标如下:

  • 减少用户的认证次数:

SSO的主要目标是让用户只需进行一次身份验证,即可访问多个服务。这可以减少用户需要进行的认证次数,提高用户体验。

  • 提高安全性:

SSO可以通过统一的身份验证机制来提高安全性。由于只有一个身份提供者负责用户身份验证,可以减少对用户密码等敏感信息的泄漏风险。同时,SSO可以提供单点注销功能,让用户可以在一次注销操作中同时退出所有服务,从而提高安全性。

  • 降低管理成本:

SSO可以减少系统管理员需要管理和维护的用户账号数量,从而降低管理成本。系统管理员只需要维护一个身份提供者即可,而不需要为每个服务单独管理用户账号和密码等信息。

  • 提高互操作性:

SSO协议通常是跨平台和跨语言的,可以提高不同系统之间的互操作性。这可以让不同组织之间的服务可以相互信任,并进行身份验证和授权。

  • 提高用户满意度:

由于SSO可以提供良好的用户体验,降低用户的认证次数和管理成本,因此可以提高用户的满意度。这可以促进服务提供商和用户之间的关系,提高服务质量和用户忠诚度。

2. 流程设计

首先,先根据以上理论模型,构建出对应的服务:

  • jiatu-sso-server:上文中所提到的IDP,基于OAuth2协议打造的授权中心
  • jiatu-sso-client:上文中所提到的SP,即接入SSO的各个业务系统
  • 浏览器:基于BS架构,用户访问的浏览器网页
  • third-sso-server:第三方登录平台,即三方IDP

2.1 单点登录

流程图如下:
基于OAuth2协议的SSO统一认证系统_第1张图片

通过上述的流程,用户只需要在一次身份验证过程中获得访问令牌,就可以在多个应用程序中访问其资源,实现基于 OAuth2 的 SSO。

2.2 SSO登出

流程图如下:
基于OAuth2协议的SSO统一认证系统_第2张图片

2.3 第三方登录

流程图如下:
SSO-第三方登录.png
流程与2.1单点登录类似,区别在于流程开始时,先要完成第三方的登录流程,而后将拿到的三方用户名(或登录唯一凭证)作为用户名,完成用户的注册及登录。

3. 数据库设计

3.1模型关系图

基于OAuth2协议的SSO统一认证系统_第3张图片

详细描述如下:

  • oauth_app_detail
    • 应用详情表,代表需要接入SSO的各个业务系统,需要由管理员手动创建应用数据,分配应用账密
  • oauth_code
    • 授权code表,验证登录成功后返回改code,默认有效期1min,用于换取access_token
  • oauth_access_token
    • 权限token表,用于保存用户登录后的访问凭证
  • oauth_refresh_token
    • 权限refresh_token表,用于保存用户登录后刷新token有效时间的凭证
  • user
    • 用户表,可以由管理员手动创建,也可以自己注册,也可由第三方登录自动创建
  • user_login_platform
    • 用户登录平台表,记录用户的登录方式,一个用户可对应多种登录方式

3.2 数据库表设计

  • 应用详情表(oauth_app_detail)
字段 类型 描述
id bigint 自增id
app_id varchar(255) 应用名称
app_secret varchar(255) 应用秘钥
authorized_grant_types varchar(255) 授权模式,可以为多个吗,以逗号隔开,可选参数如下:authorization_code,password
scope varchar(255) 请求令牌的权限范围,可选填。默认获取应用所拥有的所有客户端模式授权权限
web_server_redirect_uri varchar(255) 重定向地址
authorities varchar(255) 可用权限列表
access_token_validity int(11) access_token失效时间,单位:秒
refresh_token_validity int(11) refresh_token失效时间,单位:秒
  • 用户表(user)
字段 类型 描述
id bigint 自增id
username varchar(255) 用户名
password varchar(255) 密码
display_name varchar(255) 中文名
mobile varchar(255) 电话号码
email varchar(255) 邮箱
company varchar(255) 单位(公司)
department varchar(255) 部门
research_area varchar(255) 研究方向
use_description varchar(255) 用途说明
age int(11) 年龄
  • 用户登录平台表(user_login_platform)
字段 类型 描述
id bigint 自增id
username varchar(255) 用户名
platform varchar(255) 登录平台
third_username varchar(255) 第三方平台用户名
  • 授权code表(oauth_code)
字段 类型 描述
id bigint 自增id
username varchar(255) 用户名
authorization_code varchar(255) 授权code
  • 权限token表(oauth_access_token)
字段 类型 描述
id bigint 自增id
token_id varchar(255) token唯一性凭证
token varchar(255) token
username varchar(255) 用户名称
app_id varchar(255) 应用名称
  • 权限refresh_token表(oauth_refresh_token)
字段 类型 描述
id bigint 自增id
token_id varchar(255) token唯一性凭证
refresh_token varchar(255) refresh_token

3.3 DDL语句

CREATE TABLE `oauth_app_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增idid',
  `app_id` varchar(255) NOT NULL DEFAULT '' COMMENT '应用名称',
  `app_secret` varchar(255) NOT NULL DEFAULT '' COMMENT '应用密钥',
  `authorized_grant_types` varchar(255) NOT NULL DEFAULT '' COMMENT '授权模式,可以为多个吗,以逗号隔开,可选参数如下:authorization_code,password',
  `scope` varchar(255) NOT NULL DEFAULT '' COMMENT '请求令牌的权限范围,可选填。默认获取应用所拥有的所有客户端模式授权权限',  
  `web_server_redirect_uri` varchar(255) NOT NULL DEFAULT '' COMMENT '重定向地址',  
  `authorities` varchar(255) NOT NULL DEFAULT '' COMMENT '可用权限列表',
  `access_token_validity` int(11) NOT NULL DEFAULT 0 COMMENT 'access_token失效时间,单位:秒',
  `refresh_token_validity` int(11) NOT NULL DEFAULT 0 COMMENT 'refresh_token失效时间,单位:秒',
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
 
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='应用详情表';


CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增idid',
  `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
  `display_name` varchar(255) NOT NULL DEFAULT '' COMMENT '中文名',
  `mobile` varchar(64) NOT NULL DEFAULT '' COMMENT '电话号码',
  `email` varchar(64) NOT NULL DEFAULT '' COMMENT '邮箱',
  `company` varchar(255) NOT NULL DEFAULT '' COMMENT '单位(公司)',
  `department` varchar(255) NOT NULL DEFAULT '' COMMENT '部门',
  `research_area` varchar(255) NOT NULL DEFAULT '' COMMENT '研究方向',
  `use_description` varchar(255) NOT NULL DEFAULT '' COMMENT '用途说明',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `extra_content1` varchar(255) NOT NULL DEFAULT '' COMMENT '备用字段1',
  `extra_content2` varchar(255) NOT NULL DEFAULT '' COMMENT '备用字段2',
  `extra_content3` varchar(255) NOT NULL DEFAULT '' COMMENT '备用字段3',
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='用户表';


CREATE TABLE `user_login_platform` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增idid',
  `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
  `platform` varchar(255) NOT NULL DEFAULT '' COMMENT '登录平台',
  `third_username` varchar(255) NOT NULL DEFAULT '' COMMENT '第三方平台用户名',
  
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='用户登录平台表';


CREATE TABLE `oauth_code` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增idid',
  `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
  `authorization_code` varchar(255) NOT NULL DEFAULT '' COMMENT '授权code',
  
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='授权code表';


CREATE TABLE `oauth_access_token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `token_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'token唯一性凭证',
  `token` varchar(255) NOT NULL DEFAULT '' COMMENT 'token',
  `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名称',
  `app_id` varchar(255) NOT NULL DEFAULT '' COMMENT '应用名称',
  
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='权限token表';



CREATE TABLE `oauth_refresh_token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增idid',
  `token_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'token唯一性凭证',
  `refresh_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'refresh_token',
  
  `additional_information` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `valid` int(3) NOT NULL DEFAULT '1' COMMENT '是否有效,0-无效,1-有效',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_by` varchar(255) NOT NULL DEFAULT '' COMMENT '创建者',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `updated_by` varchar(255) NOT NULL DEFAULT '' COMMENT '更新者',
  PRIMARY KEY (`id`)
)  COMMENT='权限refresh_token表';

你可能感兴趣的:(SSO,java,开发语言)