SpringSecurity OAuth2 流程分析

参考文档:

从零开始的Spring Security OAuth2(一) www.cnkirito.moe/Spring-Secu…

使用OAuth2保护你的应用,可以分为三个步骤:
1.配置资源服务器
2.配置认证服务器
3.配置spring security

OAuth2根据使用场景不同,分成了4种模式:
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)

简单说下spring security oauth2的认证思路:
1)client模式,没有用户的概念,直接与认证服务器交互,用配置中的客户端信息去申请accessToken,客户端有自己的client_id,client_secret对应于用户的username,password,而客户端也拥有自己的authorities,当采取client模式认证时,对应的权限也就是客户端自己的authorities。

2)password模式,自己本身有一套用户体系,在认证时需要带上自己的用户名和密码,以及客户端的client_id,client_secret。此时,accessToken所包含的权限是用户本身的权限,而不是客户端的权限。

3)授权码模式使用到了回调地址,是最为复杂的方式,通常网站中经常出现的微博,qq第三方登录,都会采用这个形式。简化模式不常用。

如果你的系统已经有了一套用户体系,每个用户也有了一定的权限,可以采用password模式;如果仅仅是接口的对接,不考虑用户,则可以使用client模式。

一、OAuth2中的角色:

user:资源的拥有者
client:调用资源服务器API的应用
Oauth 2.0 Provider,包括:
1)Authorization Server:认证服务器,进行认证和授权
2)Resource Server:资源服务器,保护受保护的资源

二、下面简单介绍一下Oauth 2.0 Provider Authorization Server 认证服务器:
1)AuthorizationEndpoint:进行授权的服务,Default URL: /oauth/authorize
2)TokenEndpoint:获取token的服务,Default URL: /oauth/token

Resource Server 资源服务器:
OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证。

三、Authorization Server认证服务器详解 一般情况下,创建两个配置类:
一个继承AuthorizationServerConfigurerAdapter,
一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。

@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个Endpoint:

/oauth/token:获取token端点
/oauth/authorize:授权端点
/oauth/confirm_access:用户确认授权提交端点
/oauth/error:认证失败端点
/oauth/check_token:资源服务器用来校验token的端点
/oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥
以上这些endpoint都在源码里的endpoint包里面。

AuthorizationServerConfigurer包含三种配置: 1)ClientDetailsServiceConfigurer:client客户端的信息配置。client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities。
scope:表示权限范围,可选项,用户授权页面时进行选择
authorities:授予client的权限
authorizedGrantTypes:即前面提到的四种授权方式。

client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource。
2)AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问(几乎不需要配置)
3)AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息。比如采用什么存储方式、token的有效期等。

如何管理token:
AuthorizationServerTokenServices接口:
声明必要的关于token的操作:
1.当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。
2.访问令牌用来加载认证。 接口的实现也有多种,DefaultTokenServices是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token;

token存储方式共有三种分别是: 1.InMemoryTokenStore:存放内存中,不会持久化 2.JdbcTokenStore:存放数据库中 3.Jwt: json web token。

endpoint的URL的配置: 1.AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径。
2.WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。

四、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)

SpringSecurityFilterChain 的工作流程
理解 SpringSecurityFilterChain 的工作流程必须搞懂三个类: org.springframework.web.filter.DelegatingFilterProxy, org.springframework.security.web.FilterChainProxy , org.springframework.security.web.SecurityFilterChain。

获取Token工作流程:

访问资源工作流程:

转载于:https://juejin.im/post/5c44ab616fb9a049b34849d7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值