• 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 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

    在这里插入图片描述

     

    单点登录流程

    首次登录

    登录流程

    在这里插入图片描述

    登录步骤

    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
    
    • 1
    参数必填
    response_type固定传 code
    client_id客户端 id
    redirect_uri登录成功后回调的地址,
    scope根据配置填写

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

    在这里插入图片描述

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

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

    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
    
    • 1
    参数必填
    client_iddeliver
    client_secret配置在数据库表 oauth_client_details
    grant_type固定传 authorization_code
    code授权码,从步骤5获取
    redirect_uri回调地址,和第2步传入的 redirect_uri 一致

    在这里插入图片描述
    至此,WMS 系统成功获取单点登录服务 token,成功登录

     

    已登录

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

    登录流程

    在这里插入图片描述

    登录步骤

    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
    1. 单点登录服务判断该用户已登录,重定向到 redirect_uri 参数指定的网址( http://localhost:8082/crm)。跳转成功后,获取 code 授权码
    http://localhost:8082/crm?code=VhfYDT
    
    • 1

    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
    
    • 1

    在这里插入图片描述

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

  • 相关阅读:
    Java Streams:流操作及示例
    无人机还能“独立思考”,他们做到了...
    js创建动态key的对象ES6和ES5的方法
    keepalived配置高可用web服务器
    阿里云将投入70亿元建国际生态、增设6大海外服务中心
    【leetcode周赛】301场中国银联
    【Tomcat】为Tomcat服务配置本地Apr库以提升性能
    软件测试人需要掌握的测试知识架构体系(上)
    C#学生选课及成绩查询系统
    R语言进行孟德尔随机化+meta分析(2)----基于R和stata
  • 原文地址:https://blog.csdn.net/weixin_42555971/article/details/127637529