-
不吐不快
因为项目需求开始接触OAuth2.0授权协议。断断续续接触了有两周左右的时间。不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握,或者说先用起来(少年,一辈子辣么长,你这么着急合适吗?)。好在前人们已经做好了很好的demo,我自己照着抄一抄也就理解了大概如何用,依旧手残党,依旧敲不出好代码。忏悔…
-
WHAT?
项目之中实际使用OAuth2.0实现是用的Spring Security OAuth2.0,一套基于Spring Security项目的实现,配合Spring Security配置使用。
总体来讲,自己所理解的这套实现当中,是在Spring Security的基础之上又增加了几部分内容:
- authorization server
这部分配置算是OAuth2.0的核心配置部分。
该配置涉及:
client details service(第三方client端信息查询配置)、
token service(token查询操作相关)、
authorization code service(授权code获取)、
user approval handler(用户授权处理)、
client端的各种grant_type等等。
同时,这部分内容“内置”了两个FrameworkEndpoint(和Controller意义相同):AuthorizationEndpoint和TokenEndpoint,分别对应请求/oauth/authorize和/oauth/token。只要在spring配置文件中开启MVC配置就能使用并拦截对应
该部分简单配置:
<mvc:annotation-driven/> <mvc:default-servlet-handler/> <!-- 1. OAuth2 related config --> <oauth2:authorization-server client-details-service-ref="clientDetailsService" token-services-ref="tokenServices" user-approval-handler-ref="oauthUserApprovalHandler" user-approval-page="oauth_approval" error-page="oauth_error"> <oauth2:authorization-code authorization-code-services-ref="authorizationCodeServices" /> <oauth2:implicit/> <oauth2:refresh-token/> <oauth2:client-credentials/> <oauth2:password/> </oauth2:authorization-server> <!-- 1.1 client detail service --> <beans:bean id="clientDetailsService" class="com.cyou.nad.bet.oauth.service.impl.CustomJdbcClientDetailsServiceImpl"> <beans:constructor-arg index="0" ref="platform_dataSource"/> </beans:bean> <!-- 1.2 Config token services--> <beans:bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices"> <beans:property name="tokenStore" ref="tokenStore"/> <beans:property name="clientDetailsService" ref="clientDetailsService"></beans:property> <beans:property name="supportRefreshToken" value="true"/> </beans:bean> <beans:bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.JdbcTokenStore"> <beans:constructor-arg index="0" ref="platform_dataSource"/> </beans:bean> <!-- 1.3 oauthUserApprovalHandler --> <beans:bean id="oauthUserApprovalHandler" class="com.cyou.nad.bet.oauth.approval.SimpleTokenServiceUserApprovalHandler"> <beans:property name="tokenServices" ref="tokenServices"/> <beans:property name="oauthClientDetailsService" ref="oauthClientDetailsService"/><!-- FIXME 考虑直接使用clientDetailService --> </beans:bean> <!-- 1.4 authorization code creator --> <beans:bean id="authorizationCodeServices" class="org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices"> <beans:constructor-arg index="0" ref="platform_dataSource"/> </beans:bean>
- 第三方client配置
在spring的这套实现当中,在第三方client端也有自己单独的id、secret和权限,所以从某种程度上来讲,其实client端相当于是一种特殊的user了。
以前使用Spring Security配置user权限校验的时候,会配置authentication-manager,使用DB的话,还需要提供userService用于查询DB获取用户信息。
这里在配置OAuth的时候,client端也有类似配置,同样需要配置authentication-manager并指定clientDetailService。
实际后续了解更多之后,发现实际校验时,二者封装成的都是类UserDetails的实例
用于client端校验的AuthenticationManager配置:
<authentication-manager id="oauth2ProviderManager"> <authentication-provider user-service-ref="oauth2ClientDetailsUserService"/> </authentication-manager> <beans:bean id="oauth2ClientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService"> <beans:constructor-arg ref="clientDetailsService"/> </beans:bean>
- resource custom filter
在spring oauth2.0的配置当中,可以单独配置resource-server,指定特定的resource-id。
这个resource-server的用处在于,之后会作为一个custom-filter加到Spring Security Filter Chain当中的。当第三方client尝试访问受限资源时,该filter会对client信息和其携带过来的access_token进行校验,校验通过之后才能拿到资源。
resource配置:
<oauth2:resource-server id="userResourceServerFilter" resource-id="user" token-services-ref="tokenServices"/>
后续作为custom-filter添加到http配置中:
<http pattern="/oauth/userInfo*" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint" access-decision-manager-ref="oauth2AccessDecisionManager"> <anonymous enabled="false"/> <!-- 获取用户信息 --> <intercept-url pattern="/oauth/userInfo*" access="ROLE_UNITY,scope=READ"/> <custom-filter ref="userResourceServerFilter" before="PRE_AUTH_FILTER"/> <access-denied-handler ref="oauth2AccessDeniedHandler"/> </http>
另外需要一提的就是,OAuth2.0当中还有一个SCOPE的概念,相当于用户对client授权访问自己拥有的某一资源时,可以指定其范围,比如read(只读), write(可写),或者get_user_info(获取用户信息), share(分享)等等。一开始没有很好的理解,后来看到别的项目的配置,感觉可以这样想:如果resource对应的是工程的Controller的话,那么scope可以理解为Controller当中的方法,类似于user.getUserInfo()或者user.addShare()等。配置参考:https://github.com/cloudfoundry/uaa/blob/master/samples/api/src/main/webapp/WEB-INF/spring-servlet.xml
添加scope之后,在<http>配置的AccessDecisionManager中就需要添加用于oauth2.0 scope校验相关的voter了:
<beans:bean id="oauth2AccessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased"> <beans:constructor-arg> <beans:list> <beans:bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter"> <beans:property name="scopePrefix" value="scope="></beans:property> </beans:bean> <beans:bean class="org.springframework.security.access.vote.RoleVoter"/> <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/> </beans:list> </beans:constructor-arg> </beans:bean>
关于Spring这套实现的配置,前辈们分享的已经很多了,基本都是类似的配置。后续主要整理对于整体流程和诸如code或token的生成和存储规则相关的东西,最最重要的,还是要把使用过程中遇到的各种问题记录下来才是。
相关推荐
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
spring security oauth2.0 需要的基础 sql 文件
spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth
Spring boot+Spring Security Oauth2.0,Sprint cloud+Spring Security Oauth2集成。四种认证方式。附带有代码,和案例,案例,还有视频链接。我保证看完就回,如果视频链接失效,评论回复我,我单独再给你一份。
spring security + oauth 2.0 实现单点登录、认证授权,直接贴代码
springboot 集成oauth2.0服务器,基于oauth2.0授权码形式集成
通过点击viewbutton获取用户openid,实现方式oauth2.0认证
视频配套笔记_Spring Security OAuth2.0认证授权_v1.1 完整详细 pdf无障碍阅读,代码完整可复制
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用...
完整Oauth 2.0 代码实现,包含数据库脚本,使用说明,导入数据库脚本,修改数据库配置可直接运行。
Spring Security框架 oAuth2.0协议标准,实现认证服务器和资源服务器,并实现oAuth2.0自定义登陆和授权界面,Access_token和Refresh_token过期时间的设置,以及数据库表结构建表语句,参考博客能更好的学习和了解,...
SpringSecurity OAuth2.0用户认证
基于Owin中间件的OAuth2.0身份认证,文章位置https://blog.csdn.net/u013938578/article/details/82956188
OAUTH2.0+OpenLDAP技术框架,及适用场景,综合价值等PPT文档,可修改!!!
cas3.5.0集成oauth2.0协议,模拟cas3.5.0通过oauth2.0协议与集成了coauth2.0的cas进行模拟通信。可以实现 与新浪微博等第三方身份验证平台对接,实现单点登录。
spring oauth2.0 例子 myeclipse工程
本篇文章主要介绍了Spring Security Oauth2.0 实现短信验证码登录示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于Django2.1.2的OAuth2.0授权登录 大学生课程设计 基于Django2.1.2的OAuth2.0授权登录的课程设计 自己大二写的课程设计
全网最新的Cloud 权限系统 基于Spring Boot 2.0.4.RELEASE ...基于 Spring Security oAuth 深度定制,支持社交登录等 完整的OAuth 2.0 流程,资源服务器控制权限 去除了部分对于开发不友好的中间件,快速上手