【文章来源】https://sourl.cn/hMw7yT

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

什么是单点登录

多点登录

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

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

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

单点登录

单点登录,英文是 Single Sign On,缩写为 SSO。多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。

用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。

OAuth2认证授权的原理流程

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

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

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

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

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

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

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

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

张三首次访问档案局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),可以直接通过“档案处”查档案。

张三首次访问档案局B

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

(1)/(2) 同上;

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

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

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

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

张三再次访问档案局A

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

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

(2~8)都免了。

HTTP 重定向原理

HTTP 协议中,浏览器的 REQUEST 发给服务器之后,服务器如果发现该业务不属于自己管辖,会把你支派到自身服务器或其他服务器(host)的某个接口(uri)。

正如我们去政府部门办事,每到一个窗口,工作人员会说“你带上材料A,到本所的X窗口,或者其他Y所的Z窗口”进行下一个手续。

SSO 工作流程

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

OAuth2.0 进阶

  • RFC 6749: The OAuth 2.0 Authorization Framework

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

  • RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage

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

  • 帮你深入理解OAuth2.0协议

    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访问。

基于 SpringBoot 实现认证/授权

官方文档:Spring Cloud Security

(https://sourl.cn/nVgcBq)

授权服务器(Authorization Server)

pom.xml

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

application.properties

server.port=8110 ## 监听端口

AuthorizationServerApplication.java

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

配置授权服务的参数

@Configuration
@EnableAuthorizationServer
public class Oauth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {@Overridepublic 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 {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.requestMatchers().antMatchers("/login", "/oauth/authorize/oauth/logout").and().authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN");}
}

客户端(Client, 业务网站)

pom.xml

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

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

 配置 WEB 安全

@Configuration
@EnableOAuth2Sso
public class Oauth2WebsecurityConfigurer extends WebSecurityConfigurerAdapter {@Overridepublic 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");}
}

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

  • 授权服务器中,定义各用户拥有的角色: 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() {}
}

综合运用

权限控制方案

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

在微服务架构中的应用

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

OAuth 2 实现单点登录,通俗易懂!相关推荐

  1. shiro 跨域登录_六个高Star开源项目,让你更懂OAuth和单点登录

    现在大部分的网络应用,登录.注册.密码加密保存.token 管理等功能都是必要的.为了让用户的隐私更能得到保障,使用起来更方便,OAuth 协议和单点登录系统也就应运而生.今天 Gitee 介绍的六款 ...

  2. oauth2 单点登录_六个高Star开源项目,让你更懂OAuth和单点登录

    现在大部分的网络应用,登录.注册.密码加密保存.token 管理等功能都是必要的.为了让用户的隐私更能得到保障,使用起来更方便,OAuth 协议和单点登录系统也就应运而生.今天 Gitee 介绍的六款 ...

  3. 写了一个 SSO 单点登录的代码示例给胖友!

    发危~ " 摘要: 原创出处 http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1 ...

  4. 统一用户认证和单点登录和授权的原理与流程

    统一用户认证和单点登录和授权的原理与流程 1 前言 2 介绍 2.1 统一用户认证 2.2 单点登录 2.3 授权 3 原理 3.1 统一用户认证原理 3.2 单点登录原理 3.3 OAuth授权原理 ...

  5. 单点登录系统(SSO)的开发思路

    单点登录系统的类别:       就目前比较流行的应用来看,单点登录系统主要分为三种类型:一种是基于oauth协议的网络令牌(我是这么叫的),一种是基于Web Service或者简单Http协议实现的 ...

  6. 使用Spring Security OAuth2实现单点登录(SSO)系统

    一.单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的 ...

  7. Spring Security OAuth2 单点登录

    1. 概述 在前面的文章中,我们学习了 Spring Security OAuth 的简单使用. <Spring Security OAuth2 入门> <Spring Securi ...

  8. Oauth2.0实现单点登录的原理流程,通俗易懂

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

  9. java oauth sso 源码_基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践

    概 述 在前文<基于Spring Security和 JWT的权限系统设计>之中已经讨论过基于 Spring Security和 JWT的权限系统用法和实践,本文则进一步实践一下基于 Sp ...

最新文章

  1. 9文一览:近期必读微生物组生信论文
  2. Unity Shader基本例子
  3. 详细解读Volley(二)—— ImageRequest Request简介
  4. Maven中使用tomcat:run 出现错误 org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException...
  5. T-SQL、Jet SQL、PL-SQL
  6. 音视频技术开发周刊 | 146
  7. 给websocket加入心跳包防止自动断开连接
  8. oracle 数据更新
  9. JAVA基础学习之路(三)类定义及构造方法
  10. linux2.6.28内核对bio完成通知的改进--集中走向分离的另一个例子
  11. 2020年这个副业,能让你彻底告别死工资,你敢试吗?
  12. 前端大佬们都在使用的JavaScript工具函数宝典-内含95个工具函数方法
  13. 解决 Oracle 密码过期 the password has expired
  14. ffplay 加载 srt、ass字幕、调整对比度、亮度和饱和度、倍数播放
  15. PHP数据库CURD接口与实现(接口实战)
  16. 龙讯2号 我用带有胡伟武签名的龙芯电脑
  17. 人生的第一篇博客φ(>ω<*)
  18. 普通高考录取成绩查询2021,重磅!2021年全国高考录取分数线预测
  19. 史上最全的Java进阶书籍推荐
  20. 卷妹的成长日记之javaweb day2

热门文章

  1. PHP遍历用blade标签表示,php-Laravel Blade {{$variable或’Default Text’}}无法使用网址
  2. python 每分钟运行一次_调度Python脚本以准确地每小时运行一次
  3. 如何用Python实现多任务版的udp聊天器
  4. v2视频服务器退出系统怎么启动,V2视频会议系统入门操作手册.doc
  5. 关于学习Python的一点学习总结(7->相关字符串操作)
  6. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)
  7. Splay ---- 文艺平衡树区间翻转的建树模式
  8. 用matlab读取三角波及其频谱,信号与系统利用MATLAB分析信号频谱作业(第四章)以及结论.doc...
  9. java拼接字符串 判断内容_java--字符串拼接比较
  10. 【网络流】解题报告:luogu P3376 【模板】网络最大流