登录总结

前面基本介绍了security的常规用法,同时介绍了JWT和它的一个简单实现,基本上开发中遇到的登录问题都能解决了,即使在分布式开发,或者微服务开发中实现登录也基本没有问题了。security本身已经实现的比较完善的安全处理,加上JWT的验证方式,可以实现一个理想的登录功能。

我们来看登录,给用户一个账号,验证有效后登录成功,这一步是任何系统都无法避免的。无论这个账号只能登录一个系统还是像支付宝账号一样登录多个app,无论账号是用户名密码,还是手机验证码,或者邮箱等其他形式,可以说认证这一步是最基础的,无法避免。

登录成功后,通过授权可以让用户访问一些登录前无法访问的页面或者接口,而且无论session或者token,其实都是有有效期的,过了有效期就需要重新登录。从这种形式上看,授权包含了更多的场景,不仅是内部已经登录的用户,还有可能是第三方的应用,或者两个系统之间的信息交换等等。而且微服务的开发模式下,服务越来越多,可以被授权的内容也越来越多,如果没有统一的方式来管理这些接口资源的授权,会非常麻烦。因此,系统针对所有的访问需要有统一的认证和授权的机制,而 OAuth2.0 是我们实现这种统一认证授权非常好的一个选择。

OAuth2.0介绍

OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。最经典的场景就是我们使用QQ来进行第三方登录的时候,选择可以访问用户的哪些信息。关于OAuth 2.0的介绍,推荐读取阮一峰的三篇介绍文章,地址是:

这三篇文章是一个非常好和非常详细的OAuth2.0的入门。

关于OAuth2.0的理解,用来授权第三方应用,以前总是理解不到位的原因是,我没有站在不同的角度去分析思考。比如在使用QQ进行第三方登录时,是我们登录的软件需要获取我们qq账号的部分用户信息,因此需要腾讯的认证授权,我们需要在一键登录(授权)的时候,登录QQ,点击同意即可。

而如果我们作为开发人员,去设计一个OAuth2.0授权功能的时候,需要从开发人员角度去思考哪部分是我们要完成的功能,比如上面的QQ第三方登录,首先QQ软件是我们开发人员开发的,第三方应用有一个我们软件的QQ账号,第三方用户想在自己的软件上面展示第三方的QQ账号的部分用户信息,需要来我们的授权服务申请,同意后才能查询我们开发的软件中的用户信息,因此我们要开发的是一个基本的QQ服务(资源服务),一个授权服务,并且第三方可以在我方注册账号,或者可以给第三方分配账号。

关于第三方应用,可以是其它公司的系统,也可以本公司架构内的其它服务,大家可以根据阮一峰的文章,参考开发人员的任务属于文章中的哪些内容。这样,对开发OAuth2.0和使用OAuth2.0会有清晰的区分和理解。

SSO单点登录

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的。

当用户第一次访问应用系统A的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统B和应用系统C了。

从上面的介绍可以看得出,单点登录需要的正是一个共享的授权和验证系统,也就是说SSO是可以使用OAuth2.0机制去设计实现的。但是SSO和OAuth2.0也有一点区别,sso和oauth2.0在应用场景上的区别在于,使用sso的各个系统(子模块)之间是互相信任的,通常是一个厂家的各个软件产品,或者是一个产品的不同模块系统。使用oauth2.0的各个应用大部分之间是互相不信任的,通常是不同厂家之间的账号共享。OAuth2.0 解决的是服务提供方(微信等)给第三方应用授权的问题,而SSO解决的是大型系统中各个子系统如何共享登陆状态的问题(比如你登录了百度首页,那么你进入百度百科,百度贴吧,百度音乐等服务的时候都不需要重新登录)。

Spring Cloud Security

Spring Cloud Security组件可以理解为,springboot security加上OAuth2.0的整合,可以实现微服务系统中sso单点登录功能,和第三方授权功能,是一个强大的权限组件。关于springboot2.1.x版本对应使用的springcloud的security组件的官方文档如下:

文档的目录如下:

从目录上看,Spring Cloud Security组件主要的功能也是sso和资源认证授权,后面的内容主要用来学习Spring Cloud Security。

SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍的更多相关文章

  1. SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例

    OAuth2.0 OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.客户端来申请资源,资源所有者同意以后,资源服务器可以向客户端颁发令牌.客户端通过令牌,去请求数据.也就是说, ...

  2. SpringBootSecurity学习(16)前后端分离版之 OAuth2.0 加密配置

    示例代码的改进 前面使用spring cloud security和spring cloud oauth2写了一个第三方授权的例子,例子非常的简单,主要目的是用来熟悉OAuth2.0 申请授权的整个流 ...

  3. SpringBootSecurity学习(17)前后端分离版之 OAuth2.0 数据库(JDBC)存储客户端

    自动批准授权码 前面我们授权的流程中,第一步获取授权码的时候,都会经历一个授权是否同意页面: 这个流程就像第三方登录成功后,提问是否允许获取昵称和头像信息的页面一样,这个过程其实是可以自动同意的,需要 ...

  4. SpringBootSecurity学习(19)前后端分离版之OAuth2.0 token的存储和管理

    内存中存储token 我们来继续授权服务代码的下一个优化.现在授权服务中,token的存储是存储在内存中的,我们使用的是 InMemoryTokenStore : 图中的tokenStore方法支持很 ...

  5. SpringBootSecurity学习(23)前后端分离版之OAuth2.0 其它模式

    密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地 ...

  6. SpringBootSecurity学习(20)前后端分离版之OAuth2.0刷新token

    刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改 ...

  7. SpringBootSecurity学习(21)前后端分离版之OAuth2.0非对称加密

    JWT转换器 前面的例子中,都是在授权服务配置类中配置了一个很简单的jwt转换器,如下: 可以看到我们只用setSigningKey方法配置了一个秘钥,这里使用的是简单的对称加密的方式来加密jwt内容 ...

  8. SpringBootSecurity学习(22)前后端分离版之OAuth2.0自定义授权码

    使用JDBC维护授权码 前面的代码中,测试流程第一步都是获取授权码,然后再携带授权码去申请令牌,授权码示例如下: 产生的授权码默认是 6 位的,产生以后并没有做任何管理,可以说是一个临时性的授权码,o ...

  9. SpringBootSecurity学习(24)前后端分离版之OAuth2.0 应用登记

    应用登记 一个应用要求 OAuth 授权,必须先到对方网站登记,让对方知道是谁在请求.举个例子,下面是github的登记页面: https://github.com/settings/applicat ...

随机推荐

  1. 基于wanAndroid-项目实战

    # QzsWanAndroid - [基于 wanandroid.com 开发的 MVP + Retrofit2 + RxJava2 +okhttp3 开发的 Android APP](https:/ ...

  2. 动态数组& allocator

    问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...

  3. 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心

    https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...

  4. codeforces1076 A.B.C.D.E

    1076A 1076B 1076C 1076D 1076D A. Minimizing the String  You are given a string s consisting of n low ...

  5. UVA - 10480 Sabotage 最小割,输出割法

    UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...

  6. hdu2082 找单词 母函数模板

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. Springboot基于enable模块驱动

    enable作为模块驱动在Spring Farmework.Spring Boot.Spring Cloud使用,都是通过注解的形式以@enable作为前缀,一些常用注解如 | 框架 | 注解 | 模 ...

  8. 基于STM32F429的TFT0.96屏幕驱动

    1.介绍TFT 2.Cube配置  该屏幕是用SPI通信的,但没有MISO引脚,意思是说该屏幕只能接收数据,但无法读取里面的数据,理论上说四线就能启动,但我弄不出,只能用六线. 在Cube上只要开启六 ...

  9. 使用图灵机器人api搭建微信聊天机器人php实现

    之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...

  10. 选择正确的 Fragment#commitXXX() 函数

    转自: http://www.tuicool.com/articles/q6R7nii 最新版本(v24.0.0)的 Support v4 库中的 FragmentTransaction 添加了 co ...