Oauth2.0实现单点登录的原理流程,这次总该懂了!

news2025/1/12 13:33:56

单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。

1 什么是单点登录

1.1 多点登录

传统的多点登录系统中,每个站点都实现了本站专用的帐号数据库和登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录。如下图,有两个术语含义如下:

  • 认证(authentication): 验证用户的身份;

  • 授权(authorization): 验证用户的访问权限。

1.2 单点登录

单点登录,英文是 Single Sign On,缩写为 SSO。多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。

2 OAuth2 认证授权的原理流程

2.1 生活实例【★★重点★★】

为了直观的理解 OAuth2.0 原理流程,我们假设这样一个生活场景:

(1)档案局A(客户端 / Client):以“档案局ID/密码”标识,是掌握档案资源的机构。并列还有很多档案局B/C/…,每个档案局存储的档案内容(资源 / Resource)不一样,比如政治、经济、军事、文化等;

(2)公民张三(资源所有者 / Resource Owner):以“用户名/密码”标识,需要到各个档案局查档案;

(3)派出所(授权服务器 / Authentication Server):可以是单个巨大的派出所,也可以是数据共享的派出所集群,掌管的信息、提供的对外接口功能有:

  • 档案局信息:所有档案局的“档案局ID/密码”,证明档案局的身份;

  • 公民信息:所有公民的“用户名/密码”,能提供张三是张三的用户身份证明(认证 / Authentication)

  • 公民对于档案局的权限:有张公民和档案局的权限的映射表,可查得各公民对各档案局是否有操作权限(授权 / Authorization)。通常,设计中会增加官职(角色 / Role)一层,各公民属于哪个官职(角色),哪个官职(角色)对于特定档案局有操作权限。

2.1.1 张三首次访问档案局A

张三之前从未到访档案局,第一次来档案局。对照下图序号理解:

(1)张三来到“档案局A”的“档案处”,该处要求实名登记后才能查询,被指示到“用户登记处”办理(HTTP重定向);

(2)张三来到“档案局A”的“用户登记处”,既不能证明身份(认证),又不能证明自己有查档案A的权限(授权)。张三携带档案局A的标识(client-id),被重定向至“授权信开具处”;

(3)张三来到“派出所”的“授权信开具处”,出示档案局A的标识,希望开具授权信(授权)。该处要求首先证明身份(认证),被重定向至“用户身份验证处”;

(4)张三来到“派出所”的“用户身份验证处”,领取了用户身份表(网页登录表单 Form);

(5)张三填上自己的用户名和密码,交给(提交 / Submit)“用户身份验证处”,该处从私用数据库中查得用户名密码匹配,确定此人是张三,开具身份证明信,完成 认证。张三带上身份证明信和档案局A的标识,被重定向至“授权信开具处”;

(6)张三再次来到“授权信开具处”,出示身份证明信和档案局A的标识,该处从私用数据库中查得,张三的官职是市长级别(角色),该官职具有档案局A的查询权限,就开具“允许张三查询档案局A”的授权信(授权码 / code),张三带上授权信被重定向至“档案局”的“用户登录处”;

(7)张三到了“档案局”的“用户登录处”,该处私下拿出档案局A的标识(client-id)和密码,再附上张三出示的授权信(code),向“派出所”的“腰牌发放处”为张三申请的“腰牌”(token),将来张三可以带着这个腰牌表明身份和权限。又被重定向到“档案处”;

(8)张三的会话(Session)已经关联上了腰牌(token),可以直接通过“档案处”查档案。

2.1.2 张三首次访问档案局B

张三已经成功访问了档案局A,现在他要访问档案局B。对照下图序号理解:

(1)/(2) 同上;

(3)张三已经有“身份证明信”,直接在“派出所”的“授权信开具处”成功开具“访问档案局B”的授权信;

(4)/(5)/(6) 免了;

(7)“档案局B”的“用户登记处”完成登记;

(8)“档案局B”的“档案处”查得档案。

2.1.3 张三再次访问档案局A

张三已经成功访问了档案局A,现在他要访问档案局A。对照下图序号理解:

(1)直接成功查到了档案;

(2~8)都免了。

2.2 HTTP 重定向原理

HTTP 协议中,浏览器的 REQUEST 发给服务器之后,服务器如果发现该业务不属于自己管辖,会把你支派到自身服务器或其他服务器(host)的某个接口(uri)。正如我们去政府部门办事,每到一个窗口,工作人员会说“你带上材料A,到本所的X窗口,或者其他Y所的Z窗口”进行下一个手续。

2.3 SSO 工作流程

至此,就不难理解 OAuth 2.0 的认证/授权流程,此处不再赘述。请拿下图对照“2.1 生活实例”一节来理解。

2.4 OAuth2.0 进阶

  • https://tools.ietf.org/html/rfc6749

  • https://tools.ietf.org/html/rfc6750

  • https://blog.csdn.net/seccloud/article/details/8192707

根据官方标准,OAuth 2.0 共用四种授权模式:

  • Authorization Code: 用在服务端应用之间,这种最复杂,也是本文采用的模式;

  • Implicit: 用在移动app或者web app(这些app是在用户的设备上的,如在手机上调起微信来进行认证授权)

  • Resource Owner Password Credentials(password): 应用直接都是受信任的(都是由一家公司开发的,本例子使用)

  • Client Credentials: 用在应用API访问。

3 基于 SpringBoot 实现认证/授权

3.1 授权服务器(Authorization Server)

(1) pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

(2) application.properties

server.port=8110 ## 监听端口

(3) AuthorizationServerApplication.java

@EnableResourceServer // 启用资源服务器
public class AuthorizationServerApplication {
    // ...
}

(4) 配置授权服务的参数

@Configuration
@EnableAuthorizationServer
public class Oauth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("webapp").secret("secret") //客户端 id/secret
                .authorizedGrantTypes("authorization code") //授权妈模式
                .scopes("user_info")
                .autoApprove(true) //自动审批
                .accessTokenValiditySeconds(3600); //有效期1hour
    }
}

@Configuration
public class Oauth2WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
                .antMatchers("/login", "/oauth/authorize/oauth/logout")
                .and().authorizeRequests().anyRequest().authenticated()
                .and().formLogin().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN");
    }
}

3.2 客户端(Client, 业务网站)

(1) pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

(2) application.properties

server port=8080
security.oauth2.client.client-id=webapp
security.oauth2.client.client-secret=secret
security.oauth2.client.access-token-uri=http://localhost:8110/oauth/token
security.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorize
security.oauth2.resource.user-info-uri=http://localhost:8110/oauth/user

(3) 配置 WEB 安全

@Configuration
@EnableOAuth2Sso
public class Oauth2WebsecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests()
                .antMatchers("/", "/login").permitAll()
                .anyRequest().authenticated();
    }
}

@RestController
public class Oauth2ClientController {
    @GetMapping("/")
    public ModelAndView index() {
        return new ModelAndView("index");
    }

    @GetMapping("/welcome")
    public ModelAndView welcome() {
        return new ModelAndView("welcome");
    }
}

3.3 用户权限控制(基于角色)

  • 授权服务器中,定义各用户拥有的角色: user=USER, admin=ADMIN/USER, root=ROOT/ADMIN/USER

  • 业务网站中(client),注解标明哪些角色可

@RestController
public class Oauth2ClientController {
    @GetMapping("/welcome")
    public ModelAndView welcome() {
        return new ModelAndView("welcome");
    }

    @GetMapping("/api/user")
    @PreAuthorize("hasAuthority('USER')")
    public Map<String, Object> apiUser() {
    }

    @GetMapping("/api/admin")
    @PreAuthorize("hasAuthority('ADMIN')")
    public Map<String, Object> apiAdmin() {
    }

    @GetMapping("/api/root")
    @PreAuthorize("hasAuthority('ROOT')")
    public Map<String, Object> apiRoot() {
    }
}

4 综合运用

4.1 权限控制方案

下图是基本的认证/授权控制方案,主要设计了认证授权服务器上相关数据表的基本定义。可对照本文“2.1 生活实例”一节来理解。

4.2 在微服务架构中的应用

与常规服务架构不同,在微服务架构中,Authorization Server/Resource Server 是作为微服务存在的,用户的登录可以通过API网关一次性完成,无需与无法跳转至内网的 Authorization Server 来完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正大国际期货:外盘期货恒指八大交易法则!

现在比较流行的期货并不算多&#xff0c;主流的就是恒指期货、美原油期货和黄金期货还有德指期货、道指、铜、天然气等等&#xff0c;恒指期货是最适合亚洲人投资的期货品种&#xff0c;现在国内很多投资人也会选择恒指期货入手。那么投资者要遵循哪些法则才可能在期货市场中获…

安装虚拟机以及linux(Centos 7)系统

背景&#xff1a;模拟部署系统至Linux服务器上并运行 下载VMware Workstation Pro并激活&#xff0c;自行百度下载。 打开虚拟机“创建新的虚拟机” 然后选择自定义&#xff0c;选择好后点击下一步 直接下一步 稍后安装操作系统 客户机操作系统选择Linux&#xff0c;版本选择…

element集成第三方icon图标

引言 集成阿里图标库 进入阿里icon&#xff0c;新建项目 选择一个自己喜欢的icon库&#xff0c;将里面的图标加入购物车中 因为没有批量导入购物车&#xff0c;所以一般情况下需要一个一个去点&#xff0c;太浪费时间&#xff0c;那么请在控制台输入以下代码&#xff0c;批量…

Spring 中 @Bean 注解流程分析

代码案例 现在 SpringBoot、SpringCloud 基本上都是通过 Bean 注解来将组件交给 Spring 管理&#xff0c;所以对 Bean 的流程应该要有所了解。 这里先定义一个 Blue 的实体类&#xff0c;如下&#xff1a; public class Blue { }然后定义一个入口类&#xff0c;通过 Bean 注…

rocketMq介绍和安装

rocketMq介绍和安装 Mq介绍 MQ&#xff1a;MessageQueue&#xff0c;消息队列。 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队&#xff0c;然后按原来的顺序交由消息的消费者进行处理。 QQ和微信就是典型的MQ。 MQ的作用 主要有以下三个…

天翼物联2项成果成功入选“工信部2022年移动物联网应用典型案例库”

近日&#xff0c;工信部公布了2022年移动物联网应用典型案例征集活动入库案例名单&#xff0c;天翼物联牵头申报的“智慧农业——水肥一体化物联网项目”、“智能表计——抄表机器人物联网项目”成功入选。 本次典型应用案例征集由工业和信息化部组织开展&#xff0c;征集范围包…

产品结构设计的技巧和规则?

说到产品&#xff0c;产品结构设计在当今时代非常重要。它不仅感受到用户的青睐&#xff0c;而且影响销售&#xff0c;因此每个人都非常重视产品结构设计。那你知道产品结构设计的技巧和规则吗? 一、选材方面&#xff1a; 1.耐温等塑料制品的使用环境.耐寒.食品卫生.耐磨等; 2…

resnet(3)------卷积层与激活函数与池化层

文章目录一. 卷积层二. 激活函数1. Sigmoid函数2. tanh函数3. Relu函数三. 池化层一. 卷积层 上一篇文章我们讲到过可以通过控制卷积层的个数来提取图像的不同特征&#xff0c;但是事实上卷积是一种线性运算&#xff0c;更准确的说是一种线性加权运算&#xff0c;而线性运算是…

web课程设计网页规划与设计——惊奇漫画网站

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

基于蚁群优化算法的直流电机模糊PID控制(Matlab实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

基于jsp+mysql+ssm电影视频预约推荐系统-计算机毕业设计

项目介绍 本基于SSM框架的电影预约推荐系统主要包含了等系统用户管理、影视分类管理、电影预约信息管理、预约信息审核管理多个功能模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统是独立的运行&#xff0c;不依附于其他系统&#xff0c;可移植&…

MaxSite CMS 代码问题漏洞(CVE-2022-25411)

0x01 漏洞介绍 MaxSite CMS是俄国MaxSite CMS开源项目的一款网站内容管理系统。Maxsite CMS存在代码问题漏洞,该漏洞允许攻击者可利用该漏洞通过精心制作的PHP文件执行任意代码。漏洞在/admin/options 处的远程代码执行 (RCE) 漏洞允许攻击者通过构建的 PHP 文件执行任意代码…

能源管理系统主要功能|智慧工厂|瑜岿科技

瑜岿科技综合能源管理系统以物联网LoT平台为底座&#xff0c;并发挥其数据融合和系统集成能力&#xff0c;不断完善和扩充在数字化运维场景下的功能库&#xff0c;系统升级后具有智慧能效、智慧运维、需求响应、碳中和、资产管理、数字展示大屏等功能模块&#xff0c;现可将水、…

【ARM-Trustzone-TEE-ATF-SOC群】周刊 第一期:开篇

背景 很多小伙伴也都知道&#xff0c;学习/探讨Arm/安全/tee是有群的&#xff0c;而且不止一个。在此群中&#xff0c;有很多很多优秀的小伙伴&#xff0c;每天讨论着各种各样的技术&#xff0c;透过事务看本质&#xff0c;直奔主题的讨论。这里聚集着一些SOC大牛、ASIC大牛、…

营销革命5.0—用技术手段推动市场部变革

随着政治、经济、社会环境和消费者的需求与行为的改变&#xff0c;以及日新月异的技术进步&#xff0c;营销的思想和模式在不断迭代。科特勒教授将营销的演进划分为5个阶段&#xff1a; 第一个阶段是营销1.0时代&#xff0c;工业化时代以产品为中心的营销&#xff0c;解决企业…

sql数据库常用函数简单记录

1.参考文献 (388条消息) CAST&#xff08;&#xff09;函数用法_普通网友的博客-CSDN博客_cast函数 (388条消息) oracle生成标准uuid,Oracle 生成uuid方法_Ms 陈的博客-CSDN博客 (388条消息) oracle的exists用法总结_见怪不怪丶的博客-CSDN博客_oracle exists (388条消息) …

Proxmox VE+Openstack超融合私有云建设案例(低成本高价值,拿走不谢,干翻公有云)

目录本文最终实现目标材料准备路由器设置机房静态公网ip设置WAN口宽带动态公网ip设置WAN口和DDNSLAN口设置wifi设置交换机配置服务器配置iBMC密码和ip设置升级固件Bios恢复到出厂设置PVE安装和网卡聚合mode4配置下载PVE iso文件iBMC设置光盘启动登录iBMC的KVM服务器硬盘设置连接…

CANoe-Test Trace Window、Vector设备的以太网端口

1. Test Trace Window Test Trace Window,测试跟踪窗口,是CANoe软件在Test Units的测试用例执行期间,观察和分析测试的所有执行动作的界面 打开测试跟踪窗口的方式有两种: 添加测试跟踪窗口有两种方式: 方法1方法2方法2也可以删除测试跟踪窗口 测试跟踪窗口可以通过Conf…

BOM:浏览器对象模型

BOM的全称browser object mode css不可调整的一般都是浏览器的部分&#xff0c;比如&#xff1a;浏览器的滚动条、地址栏、关闭按钮、刷新按钮。 BOM可以操作浏览器&#xff1a; 1.弹出框 //提示框 // window.alert() //输入框 // window.prompt() //询问框&#xff1a;返回值…

认识一下容器网络接口 CNI

写在最前&#xff0c;周末写到这篇的时候我就发现可能是给自己挖了很大的坑&#xff0c;整个 Kubernetes 网关相关的内容会非常复杂且庞大。 深入探索 Kubernetes 网络模型和网络通信认识一下容器网络接口 CNI&#xff08;本篇&#xff09;源码分析&#xff1a;从 kubelet、容…