`
指隙阳光12138
  • 浏览: 17981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【OAuth2.0】Spring Security OAuth2.0篇之初识

阅读更多
  • 不吐不快

  

  因为项目需求开始接触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 (讲义+代码)

    Spring Security OAuth2.0 是一个强大的安全框架,用于构建安全的Web应用和API。OAuth2.0 是一种授权框架,允许第三方应用在用户许可的情况下访问其受保护的资源,而无需共享用户凭证。本讲义结合代码将深入探讨如何...

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

    spring security + oauth 2.0 实现单点登录、认证授权

    Spring Security和OAuth 2.0是两个在Web应用安全领域广泛应用的框架,它们结合使用可以构建强大的单点登录(SSO)和认证授权系统。在这个系统中,`xp-sso-server`代表了认证服务器,而`xp-sso-client-a`和`xp-sso-...

    视频配套笔记_Spring Security OAuth2.0认证授权_v1.1.rar

    Spring Security OAuth2.0 是一个广泛使用的Java安全框架,它为构建安全的Web应用程序提供了强大的支持。OAuth2.0是授权框架的一个标准,允许第三方应用在用户授权的情况下访问其私有资源,而无需共享用户的登录凭证...

    spring security oauth2.0 需要的基础 sql 文件

    spring security oauth2.0 需要的基础 sql 文件

    Spring Security Oauth2.0认证授权专题

    Spring boot+Spring Security Oauth2.0,Sprint cloud+Spring Security Oauth2集成。四种认证方式。附带有代码,和案例,案例,还有视频链接。我保证看完就回,如果视频链接失效,评论回复我,我单独再给你一份。

    spring security 基于oauth 2.0 实现 sso 单点登录Demo.zip

    spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth

    完整Oauth 2.0实现实例

    - 使用 Spring Security OAuth2 框架,它可以简化 OAuth 2.0 的实现。首先,你需要在项目中引入相关依赖。 - 配置授权服务器,定义客户端详情,包括客户端ID、客户端秘密、授权类型等。 - 创建数据库表,用于存储...

    微信oauth2.0授权

    微信OAuth2.0授权是一种广泛应用于移动应用和网站的第三方登录解决方案,主要目的是为了安全地获取用户的微信身份标识——openid,以便提供个性化服务或者与其他微信功能集成。在本文中,我们将详细探讨微信OAuth2.0...

    Spring Security OAuth 2.0

    Spring Security OAuth 2.0 Spring Security OAuth 2.0 是一种基于 OAuth 2.0 协议的身份验证和授权框架,它提供了一个灵活和可扩展的解决方案来保护基于 Web 的应用程序。OAuth 2.0 是一种行业标准的授权协议,...

    OAuth2.0协议中文版

    OAuth 2.0 协议中文译本共分为九大部分,分别介绍了 OAuth 2.0 协议的背景知识、术语中英对照表、OAuth 2.0 协议的中文译本、OAuth 2.0 协议的工作流程、OAuth 2.0 协议的安全机制、OAuth 2.0 协议的优点、OAuth 2.0...

    spring cloud + vue + oAuth2.0全家桶实战

    《Spring Cloud + Vue + OAuth2.0全家桶实战:构建企业级微服务项目》 在当前的互联网开发环境中,微服务架构已经成为企业级应用的重要选择。Spring Cloud作为Java领域的微服务治理框架,Vue.js作为前端的轻量级库...

    springboot集成oauth2.0

    在"spring-security-oauth2-example-master"这个项目中,你可以找到一个完整的SpringBoot集成OAuth2.0的示例,包括配置、控制器、服务以及客户端的实现,通过学习和研究该项目,可以更好地理解上述知识点,并实际...

    cas3.5.0集成oauth2.0协议

    **OAuth2.0协议概述** OAuth2.0是一种授权框架,允许第三方应用在用户许可的情况下,访问特定资源。它主要用于安全地实现用户数据的共享,比如社交媒体登录、云存储服务等。OAuth2.0的核心是将用户的授权过程与实际...

    OAuth2.0代码模拟实现

    在这个OAuth2.0实现中,它将定义项目依赖,如Spring Security OAuth2库,用于处理OAuth2.0协议的各个步骤。可能的依赖包括`spring-security-oauth2`, `spring-web`, `spring-security-core`, `spring-security-...

    webapi基于Owin中间件的oauth2.0身份认证

    1. **安装Owin中间件**:在ASP.NET Web API项目中,首先需要通过NuGet包管理器安装`Microsoft.Owin.Security.OAuth`和`Microsoft.Owin.Security.Cookies`,这两个包分别用于OAuth2.0授权和Cookie认证。 2. **配置...

    spring oauth2.0 例子

    1. **配置OAuth2.0服务器**:在Spring中,我们通常使用`Spring Security OAuth2`库来设置授权服务器。你需要配置`AuthorizationServerConfigurerAdapter`以定义客户端详细信息、令牌端点、刷新令牌策略等。 2. **...

    基于Django2.1.2的OAuth2.0授权登录

    **基于Django 2.1.2的OAuth2.0授权登录详解** OAuth2.0是一种开放标准,用于授权第三方应用访问用户存储在另一服务提供商(如社交媒体网站)上的私有资源,而无需共享用户的登录凭证。在Django框架中实现OAuth2.0...

    OAuth2.0 使用到的jar包

    对应的jar包可能包含`spring-security-oauth2`,这个包是Spring Security的一个扩展,提供了OAuth2.0的实现。 2. **Resource Server(资源服务器)**:保护了需要访问的资源,只有持有有效令牌的客户端才能访问。...

    Oauth2.0 协议 服务端 客户端 thinkphp5.0

    OAuth2.0是一种广泛使用的开放授权协议,它允许第三方应用在用户无需透露其登录凭证的情况下,获取有限的访问权限去操作用户的资源。这个协议的主要目的是为了解决API的安全访问问题,尤其是在社交媒体、云存储和...

Global site tag (gtag.js) - Google Analytics