Spring Security 鉴权机制Oauth2 v1.2

举报
tea_year 发表于 2025/09/30 17:22:34 2025/09/30
【摘要】 用户认证核心需解决身份验证、跨系统访问及第三方授权三大问题,保障系统资源安全与用户体验。身份认证是基础,验证用户合法性(如账号密码登录);授权则控制认证后资源访问范围,确保权限合规;单点登录(SSO)针对多子系统场景,实现 “一次认证,多系统通行”,提升用户体验。第三方认证则允许用户通过外部平台(如微信)授权登录,无需额外注册。 技术方案上,SSO 通过独立认证系统与 Redis 存储用户信息实现

用户认证需求分析

1.1 用户认证与授权

截至目前,项目已经完成了在线学习功能,用户通过在线学习页面点播视频进行学习。如何去记录学生的学习过程 呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什么课程;如果用户要购 买课程也需要知道用户的身份信息。所以,去管理学生的学习过程最基本的要实现用户的身份认证。


什么是用户身份认证?

用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的用户身份认 证表现形式有:用户名密码登录,指纹打卡等方式。


什么是用户授权?

用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没 有权限的资源将无法访问,这个过程叫用户授权。

1.2 单点登录需求

本项目包括多个子项目,如:学习系统,教学管理中心、系统管理中心等,为了提高用户体验性需要实现用户只认 证一次便可以在多个拥有访问权限的系统中访问,这个功能叫做单点登录。

引用百度百科:单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。


下图是SSO的示意图,用户登录腾讯课堂一次即可访问多个系统。

image-20210115094209405.png


1.3 第三方认证需求

作为互联网项目难免需要访问外部系统的资源,同样本系统也要访问第三方系统的资源接口,一个场景如下


一个微信用户没有在腾讯课堂注册,本系统可以通过请求微信系统来验证该用户的身份,验证通过后该用户便可在 本系统学习,它的基本流程如下

image-20210115094240918.png


从上图可以看出,微信不属于本系统,本系统并没有存储微信用户的账号、密码等信息,本系统如果要获取该用户 的基本信息则需要首先通过微信的认证系统(微信认证)进行认证,微信认证通过后本系统便可获取该微信用户的 基本信息,从而在本系统将该微信用户的头像、昵称等信息显示出来,该用户便不用在本系统注册却可以直接学 习。


什么是第三方认证(跨平台认证)?

当需要访问第三方系统的资源时需要首先通过第三方系统的认证(例如:微信认证),由第三方系统对用户认证通 过,并授权资源的访问权限

image-20210115094307317.png

2 用户认证技术方案

2.1 单点登录技术方案

分布式系统要实现单点登录,通常将认证系统独立抽取出来,并且将用户身份信息存储在单独的存储介质,比如: MySQL、Redis,考虑性能要求,通常存储在Redis中,如下图:

image-20210115094330931.png

单点登录的特点是:

1、认证系统为独立的系统。 2、各子系统通过Http或其它协议与认证系统通信,完成用户认证。 3、用户身份信息存储在Redis集群。


Java中有很多用户认证的框架都可以实现单点登录:

1、Apache Shiro. 2、CAS 3、Spring security CAS

2.2 Oauth2认证

2.2.1 Oauth2 认证流程

第三方认证技术方案最主要是解决认证协议的通用标准 问题,因为要实现 跨系统认证,各系统之间要遵循一定的 接口协议。

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认 证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实 现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。互联网 很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明

OAUTH标准逐渐成为开放资源授权的标准。

Oauth 协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。

参考:https://baike.baidu.com/item/oAuth/7153134?fr=aladdin

Oauth协议:https://tools.ietf.org/html/rfc6749

下边分析一个Oauth2认证的例子,网站使用微信认证的过程

image-20210115094429610.png

1、客户端请求第三方授权 用户进入网站程序的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者

image-20210115094447146.png

点击“微信”出现一个二维码,此时用户扫描二维码,开始给网站授权。

2、资源拥有者同意给客户端授权

资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证, 验证通过后,微信会询问用户是否给授权网站访问自己的微信数据,用户点击“确认登录”表示同意授权,微信认证服务器会颁发一个授权码,并重定向到登录的网站。

3、客户端获取到授权码,请求认证服务器申请令牌 此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。

4、认证服务器向客户端响应令牌 认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。 此交互过程用户看不到,当客户端拿到令牌后,用户在网站看到已经登录成功。

5、客户端请求资源服务器的资源 客户端携带令牌访问资源服务器的资源。 网站携带令牌请求访问微信服务器获取用户的基本信息。

6、资源服务器返回受保护资源

资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。 注意:资源服务器和认证服务器可以是一个服务也可以分开的服务,如果是分开的服务资源服务器通常要请求认证 服务器来校验令牌的合法性。

总结

用户认证核心需解决身份验证、跨系统访问及第三方授权三大问题,保障系统资源安全与用户体验。身份认证是基础,验证用户合法性(如账号密码登录);授权则控制认证后资源访问范围,确保权限合规;单点登录(SSO)针对多子系统场景,实现 “一次认证,多系统通行”,提升用户体验。第三方认证则允许用户通过外部平台(如微信)授权登录,无需额外注册。
技术方案上,SSO 通过独立认证系统与 Redis 存储用户信息实现,支持 Apache Shiro、CAS 等框架,各子系统与认证系统通信完成验证,避免重复登录。第三方认证采用 OAuth2.0 协议,流程分六步:用户请求第三方授权、资源拥有者同意授权、客户端获取授权码、申请令牌、携带令牌访问资源、资源服务器返回数据,确保跨系统认证标准化,兼容 Google、微信等主流平台,既简化用户操作,又保障认证安全。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。