前言:

关于oauth2,其实是一个规范,本文重点讲解spring对他进行的实现,如果你还不清楚授权服务器,资源服务器,认证授权等基础概念,可以移步理解OAuth 2.0 - 阮一峰,这是一篇对于oauth2很好的科普文章。

需要对spring security有一定的配置使用经验,用户认证这一块,spring security oauth2建立在spring security的基础之上。第一篇文章主要是讲解使用springboot搭建一个简易的授权,资源服务器,在文末会给出具体代码的github地址。后续文章会进行spring security oauth2的相关源码分析。Java中的安全框架如shrio,已经有跟我学shiro - 开涛,非常成体系地,深入浅出地讲解了apache的这个开源安全框架,但是spring security包括oauth2一直没有成体系的文章,学习它们大多依赖于较少的官方文档,理解一下基本的使用配置;通过零散的博客,了解一下他人的使用经验;打断点,分析内部的工作流程;看源码中的接口设计,以及注释,了解设计者的用意。spring的各个框架都运用了很多的设计模式,在学习源码的过程中,也大概了解了一些套路。spring也在必要的地方添加了适当的注释,避免了源码阅读者对于一些细节设计的理解产生偏差,让我更加感叹,spring不仅仅是一个工具框架,更像是一个艺术品。

概述:

使用oauth2保护你的应用,可以分为简易的分为三个步骤

配置资源服务器
配置认证服务器
配置spring security
前两点是oauth2的主体内容,但前面我已经描述过了,spring security oauth2是建立在spring security基础之上的,所以有一些体系是公用的。

oauth2根据使用场景不同,分成了4种模式

授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)
本文重点讲解接口对接中常使用的密码模式(以下简称password模式)和客户端模式(以下简称client模式)。授权码模式使用到了回调地址,是最为复杂的方式,通常网站中经常出现的微博,qq第三方登录,都会采用这个形式。简化模式不常用。
以上文字摘自超哥的从零开始的Spring Security Oauth2

一、oauth中的角色

client:调用资源服务器API的应用

Oauth 2.0 Provider:包括Authorization Server和Resource Server

(1)Authorization Server:认证服务器,进行认证和授权

(2)Resource Server:资源服务器,保护受保护的资源

user:资源的所属者

二、Oauth 2.0 Provider

Authorization Server:
(1)AuthorizationEndpoint:进行授权的服务,Default URL: /oauth/authorize

(2)TokenEndpoint:获取token的服务,Default URL: /oauth/token

Resource Server:
OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证

三、Authorization Server:

1、@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个Endpoint:(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然真正用到生产环境还是要进行一些配置和复写工作的。)

/oauth/authorize:验证

/oauth/token:获取token

/oauth/confirm_access:用户授权

/oauth/error:认证失败

/oauth/check_token:资源服务器用来校验token

/oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥

以上这些endpoint都在源码里的endpoint包里面。

2、AuthorizationServerConfigurer包含三种配置:

ClientDetailsServiceConfigurer:client客户端的信息配置,client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities

(1)scope:表示权限范围,可选项,用户授权页面时进行选择

(2)authorizedGrantTypes:有四种授权方式

Authorization Code:用验证获取code,再用code去获取token(用的最多的方式,也是最安全的方式)
Implicit: 隐式授权模式
Client Credentials (用來取得 App Access Token)
Resource Owner Password Credentials

(3)authorities:授予client的权限

这里的具体实现有多种,in-memory、JdbcClientDetailsService、jwt等。

AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问

AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token的有效期等

client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。

jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource.

下面再介绍一下如何管理token:
AuthorizationServerTokenServices接口:声明必要的关于token的操作

(1)当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。

(2)访问令牌用来加载认证

接口的实现也有多种,DefaultTokenServices是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token;

token存储方式共有三种分别是:
(1)InMemoryTokenStore:存放内存中,不会持久化

(2)JdbcTokenStore:存放数据库中

(3)Jwt: json web token,详见 http://blog.leapoahead.com/2015/09/06/understanding-jwt/

授权类型:
可以通过AuthorizationServerEndpointsConfigurer来进行配置,默认情况下,支持除了密码外的所有授权类型。相关授权类型的一些类:

(1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型

(2)userDetailsService:如果注入UserDetailsService,那么将会启动刷新token授权类型,会判断用户是否还是存活的

(3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务

(4)implicitGrantService:imlpicit grant

(5)tokenGranter:

endpoint的URL的配置:
(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径

(2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。

自定义UI:

(1)实际项目开发中,我们可能需要自定义的登录页面和认证页面。只需要创建一个login.html,利用thymeleaf结合springsecurity的配置进行自定义登录页面,因为默认的oauth2的登录点是/login,当然这个是可以根据自己的需求进行更改的 。

(2)另外一个是授权页。此页面可以参考源码里的实现,自己生成一个controller的类,再创建一个对应的web页面即可实现自定义的功能,后续文章会为大家介绍如何正确的生成授权页面,目前我只有2中方式 或许还有更多方法 需要等大家一起探讨探讨。

四、Resource Server:保护资源,需要令牌才能访问

在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置:

(1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务

(2)resourceId:资源Id,由auth Server验证。

(3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor

(4)一些自定义的资源保护配置,通过HttpSecurity来设置

使用token的方式也有两种:

(1)Bearer Token(https传输方式保证传输过程的安全):主流

(2)Mac(http+sign)

如何访问资源服务器中的API?

如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。

(1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。

(2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。

(3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。

五、oauth client
在客户端获取到token之后,想去调用下游服务API时,为了能将token进行传递,可以使用RestTemplate.然后使用restTemplate进行调用Api。

注:scopes和authorities的区别:

scopes是client权限,至少授予一个scope的权限,否则报错。

authorities是用户权限。

六、各大开放平台的鉴权对比:
百度:http://developer.baidu.com/wiki/index.php?title=docs/oauth#.E6.8E.88.E6.9D.83.E5.9B.9E.E8.B0.83.E5.9C.B0.E5.9D.80

github: https://developer.github.com/v3/oauth/#scopes

参考实际项目的github地址:https://github.com/dqqzj/spring4all/tree/master/oauth2

http://www.spring4all.com/article/883

Spring Security Oauth2系列(一)的更多相关文章

  1. Spring Security Oauth2 permitAll()方法小记

    黄鼠狼在养鸡场山崖边立了块碑,写道:"不勇敢地飞下去,你怎么知道自己原来是一只搏击长空的鹰?!" 从此以后 黄鼠狼每天都能在崖底吃到那些摔死的鸡! 前言 上周五有网友问道,在使用s ...

  2. 使用Spring MVC测试Spring Security Oauth2 API

    不是因为看到希望了才去坚持,而坚持了才知道没有希望. 前言 在Spring Security源码分析十一:Spring Security OAuth2整合JWT和Spring Boot 2.0 整合 ...

  3. Re:从零开始的Spring Security Oauth2(三)

    上一篇文章中我们介绍了获取token的流程,这一篇重点分析一下,携带token访问受限资源时,内部的工作流程. @EnableResourceServer与@EnableAuthorizationSe ...

  4. Spring Security Oauth2 自定义 OAuth2 Exception

    付出就要得到回报,这种想法是错的. 前言 在使用Spring Security Oauth2登录和鉴权失败时,默认返回的异常信息如下 { "error": "unauth ...

  5. Spring Security OAuth2 Demo —— 隐式授权模式(Implicit)

    本文可以转载,但请注明出处https://www.cnblogs.com/hellxz/p/oauth2_impilit_pattern.html 写在前面 在文章OAuth 2.0 概念及授权流程梳 ...

  6. Spring Security 解析(七) —— Spring Security Oauth2 源码解析

    Spring Security 解析(七) -- Spring Security Oauth2 源码解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...

  7. Spring Security 解析(五) —— Spring Security Oauth2 开发

    Spring Security 解析(五) -- Spring Security Oauth2 开发   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决 ...

  8. Spring Security OAuth2之resource_id配置与验证

    一.resource_id的作用 Spring Security OAuth2 架构上分为Authorization Server认证服务器和Resource Server资源服务器.我们可以为每一个 ...

  9. [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权

    一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...

随机推荐

  1. LeetCode之“数学”:Plus One

    题目链接 题目要求: Given a non-negative number represented as an array of digits, plus one to the number. Th ...

  2. sql记录查询重复注意事项(经验提升),in的用法和效率

    sql查询重复记录,使用: select * from dimappnamenew as appn where id in (   select id   from dimappnamenew gro ...

  3. 【44】java大数值剖析

    基本的整数和浮点型精度不能满足需求,那么可以使用java.math中的两个类:BigInteger和BigDecimal. BigInteger和BigDecimal介绍: 这两个类可以处理包含任意长 ...

  4. masm下几种常见函数调用方式

    masm没有fastcall调用方式,其特点为: 1 第一个参数放入ecx,第二个参数放入edx: 2 如果有剩余参数则从右向左压栈: 3 被调用函数清理栈(平衡栈): 4 若有返回值放入eax: 5 ...

  5. spring boot之入门配置(一)

    yml.properties配置文件 yml相比properties配置文件,yml可以省略不必要的前缀,并且看起来更加的有层次感.推荐使用yml文件. @Value 根据配置文件的配置项获取对应的v ...

  6. DBC的故事

    1.DBC定义 DBC(data base CAN)是汽车ECU间进行CAN通讯的报文内容,有了它相互之间才能听懂. 2.DBC查看 DBC是文本文件,可以用记事本打开,一般都用CANdb++,可以更 ...

  7. HTML元素的专用传参数据属性

    把参数直接放到事件定义里面,类似下面这样,也是可以,但是这样不够Nice. <a href="javascript:void(0)" onclick="clickh ...

  8. svn Server sent unexpected return value (403 Forbidden) in response to CHECKOUT

    今天,提交資料到公司svn服務器,但是一直提示 Server sent unexpected return value (403 Forbidden) in response to CHECKOUT ...

  9. 学习JavaScript最佳实践方法

    首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...

  10. vim编辑器常见命令归纳大全

    Esc:命令行模式 i:插入命令 a:附加命令 o:打开命令 c:修改命令 r:取代命令 s:替换命令 以上进入文本输入模式   : 进入末行模式 末行模式: w:保存 q:退出,没保存则无法退出 w ...