Spring Security 单点登录

文章目录

  • 优势
  • 客户端注册
  • 单点登录流程
    • 首次登录
    • 已登录

oauth 2.0 服务端可以参考文章: Spring Security oauth2.0 服务端
 

优势

  • 够减少密码输入疲劳,免去多系统多账号密码的烦劳
  • 减少登录次数,提高工作效率
  • 为系统管理人员工作提供便利,如员工离职,系统管理员能够撤消任何用户对所有应用程序的访问权限
  • 简化业务系统的开发成本,业务系统无需实现登录校验逻辑
  • 统一用户管理,用户信息来源一致
  • 优化用户跟踪审计,可根据不同应用程序跟踪用户以进行审计和记录
     

客户端注册

创建表 oauth_client_details 用来存储客户端信息

CREATE TABLE `oauth_client_details` (
	`client_id` VARCHAR ( 256 ) CHARACTER 
	SET utf8 NOT NULL,
	`resource_ids` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`client_secret` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`scope` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`authorized_grant_types` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`web_server_redirect_uri` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`authorities` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`access_token_validity` INT ( 11 ) DEFAULT NULL,
	`refresh_token_validity` INT ( 11 ) DEFAULT NULL,
	`additional_information` VARCHAR ( 4096 ) CHARACTER 
	SET utf8 DEFAULT NULL,
	`autoapprove` VARCHAR ( 256 ) CHARACTER 
	SET utf8 DEFAULT NULL,
PRIMARY KEY ( `client_id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;
  • client_id:主键,必须唯一,不能为空.
  • resource_ids:设置 client 可以访问哪些资源服务,如果没设置,则可以访问所有,多个资源时用逗号(,)分隔
  • client_secret:指定客户端(client)的访问密匙,加上 {noop} 表示不加密,如 {noop}123
  • scope:指定客户端申请的权限范围,可选值包括read、write,、rust;若有多个权限范围用逗号(,)
  • authorized_grant_types:指定客户端支持的 grant_type,可选值包括authorization_code、password,refresh_token、implicit、client_credentials, 若支持多个grant_type用逗号(,)分隔
  • web_server_redirect_uri:客户端的重定向URI,可为空,多个则用逗号隔开
  • authorities:客户端所拥有的 Spring Security 的权限值,类似于角色,若有多个权限值用逗号(,)分隔
  • access_token_validity 设定客户端的 access_token 的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时)
  • refresh_token_validity:设定客户端的refresh_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天);若客户端的 grant_type 不包括 refresh_token,则不用关心该字段
  • additional_information:这是一个预留的字段,在 Oauth 的流程中没有实际的使用,但若设置值,必须是JSON格式的数据
  • autoapprove:设置用户是否自动 Approval 操作,默认值为 ‘false’,可选值包括 ‘true’,‘false’, ‘read’,‘write’.
    该字段只适用于 grant_type=“authorization_code” 即授权码的情况,当用户登录成功后,若该值为’true’或支持的scope值,则会跳过用户 Approve 的页面, 直接授权.

添加两个客户端,wms 和 crm

在这里插入图片描述

 

单点登录流程

首次登录

登录流程

Spring Security 单点登录_第1张图片

登录步骤

  1. 用户请求登录 WMS
  2. WMS 前端向单点登录服务发送请求
    GET 请求,参数使用 form 表单提交
 http://localhost:8055/oauth/authorize?response_type=code&client_id=wms&redirect_uri=http://localhost:8083/test/login&scope=all
参数 必填
response_type 固定传 code
client_id 客户端 id
redirect_uri 登录成功后回调的地址,
scope 根据配置填写

3、单点登录服务判断该用户首次登录,重定向到登录界面

Spring Security 单点登录_第2张图片

4、用户在输入账号 、密码,点击登录
5、验证登录成功后,重定向到 redirect_uri 参数指定的网址( http://localhost:8081/wms)。跳转成功后,获取 code 授权码

http://localhost:8081/wms?code=cIlQAq

6、拿到授权码后,向单点登录服务发送获取 token 请求
POST 请求,参数使用 form 表单提交

localhost:8055/oauth/token?grant_type=authorization_code&client_id=wms&client_secret=TGgxxvGWUTx7JnOBfujl8zYD2a3GjOM3&code=cIlQAq&redirect_uri=http://localhost:8081/wms
参数 必填
client_id deliver
client_secret 配置在数据库表 oauth_client_details
grant_type 固定传 authorization_code
code 授权码,从步骤5获取
redirect_uri 回调地址,和第2步传入的 redirect_uri 一致

Spring Security 单点登录_第3张图片
至此,WMS 系统成功获取单点登录服务 token,成功登录

 

已登录

场景:经过上述步骤,用户已成功登录 WMS 系统,现用户再登录 CRM 系统,不需要输入账号密码,直接进入 CRM 系统

登录流程

Spring Security 单点登录_第4张图片

登录步骤

  1. 用户请求登录 CRM
  2. CRM 前端向单点登录服务发送请求
    GET 请求,参数使用 form 表单提交
 http://localhost:8055/oauth/authorize?response_type=code&client_id=crm&scope=all&redirect_uri=http://localhost:8082/crm
  1. 单点登录服务判断该用户已登录,重定向到 redirect_uri 参数指定的网址( http://localhost:8082/crm)。跳转成功后,获取 code 授权码
http://localhost:8082/crm?code=VhfYDT

6、拿到授权码后,向单点登录服务发送获取 token 请求
POST 请求,参数使用 form 表单提交

localhost:8055/oauth/token?grant_type=authorization_code&client_id=crm&client_secret=TGgxxvGWUTx7JnOBfujl8zYD2a3GjOM3&code=VhfYDT&redirect_uri=http://localhost:8082/crm

Spring Security 单点登录_第5张图片

至此,CRM 系统成功获取单点登录服务 token,成功登录

你可能感兴趣的:(JAVA,security,spring,java)