单点登录(SSO)是一种身份验证和授权机制,允许用户使用一组凭据(例如用户名和密码)登录到多个应用程序或系统中,而无需为每个应用程序输入不同的凭据。这种机制提高了用户体验,简化了身份验证和授权的过程,减少了密码管理的负担,提高了安全性。
目前市场上有多种SSO解决方案,包括基于标准协议的解决方案(如SAML、OAuth、OpenID Connect)和专有协议的解决方案。经过对比,我们的SSO采用目前主流的OAuth2解决方案,在安全性,可扩展性、互操作性方面都有显著优点。
在单点登录(SSO)中,有两个重要的角色:服务提供者(Service Provider,SP)和身份提供者(Identity Provider,IDP)。下面对它们进行简要说明:
服务提供者(Service Provider,SP):服务提供者是提供服务的应用程序或系统。在SSO中,SP会向身份提供者发起身份验证请求,以验证用户的身份信息。如果验证成功,SP会授予用户访问其服务的权限。
身份提供者(Identity Provider,IDP):身份提供者是管理用户身份信息的系统。在SSO中,IDP负责验证用户的身份信息,并在验证成功后向SP颁发安全令牌,以证明用户已经通过身份验证。SP可以使用该安全令牌来授予用户访问其服务的权限。
基于OAuth2协议,打造一套安全、便捷、经济、可靠的身份验证和授权系统,主要目标如下:
SSO的主要目标是让用户只需进行一次身份验证,即可访问多个服务。这可以减少用户需要进行的认证次数,提高用户体验。
SSO可以通过统一的身份验证机制来提高安全性。由于只有一个身份提供者负责用户身份验证,可以减少对用户密码等敏感信息的泄漏风险。同时,SSO可以提供单点注销功能,让用户可以在一次注销操作中同时退出所有服务,从而提高安全性。
SSO可以减少系统管理员需要管理和维护的用户账号数量,从而降低管理成本。系统管理员只需要维护一个身份提供者即可,而不需要为每个服务单独管理用户账号和密码等信息。
SSO协议通常是跨平台和跨语言的,可以提高不同系统之间的互操作性。这可以让不同组织之间的服务可以相互信任,并进行身份验证和授权。
由于SSO可以提供良好的用户体验,降低用户的认证次数和管理成本,因此可以提高用户的满意度。这可以促进服务提供商和用户之间的关系,提高服务质量和用户忠诚度。
首先,先根据以上理论模型,构建出对应的服务:
通过上述的流程,用户只需要在一次身份验证过程中获得访问令牌,就可以在多个应用程序中访问其资源,实现基于 OAuth2 的 SSO。
流程图如下:
流程与2.1单点登录类似,区别在于流程开始时,先要完成第三方的登录流程,而后将拿到的三方用户名(或登录唯一凭证)作为用户名,完成用户的注册及登录。
详细描述如下:
字段 | 类型 | 描述 |
---|---|---|
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失效时间,单位:秒 |
字段 | 类型 | 描述 |
---|---|---|
id | bigint | 自增id |
username | varchar(255) | 用户名 |
password | varchar(255) | 密码 |
display_name | varchar(255) | 中文名 |
mobile | varchar(255) | 电话号码 |
varchar(255) | 邮箱 | |
company | varchar(255) | 单位(公司) |
department | varchar(255) | 部门 |
research_area | varchar(255) | 研究方向 |
use_description | varchar(255) | 用途说明 |
age | int(11) | 年龄 |
字段 | 类型 | 描述 |
---|---|---|
id | bigint | 自增id |
username | varchar(255) | 用户名 |
platform | varchar(255) | 登录平台 |
third_username | varchar(255) | 第三方平台用户名 |
字段 | 类型 | 描述 |
---|---|---|
id | bigint | 自增id |
username | varchar(255) | 用户名 |
authorization_code | varchar(255) | 授权code |
字段 | 类型 | 描述 |
---|---|---|
id | bigint | 自增id |
token_id | varchar(255) | token唯一性凭证 |
token | varchar(255) | token |
username | varchar(255) | 用户名称 |
app_id | varchar(255) | 应用名称 |
字段 | 类型 | 描述 |
---|---|---|
id | bigint | 自增id |
token_id | varchar(255) | token唯一性凭证 |
refresh_token | varchar(255) | refresh_token |
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表';