Spirng Security OAuth介绍

如果想要深入了解Spring Security OAuth的话,建议阅读官方提供的示例代码:

以下内容大部分翻译自:http://projects.spring.io/spring-security-oauth/docs/oauth2.html

OAuth 2.0 Provider

OAuth 2.0 Provider实现

对于OAuth 2.0 Provider实际可以分为两个部分:授权服务(Authorization Service)和资源服务(Resource Service),有的时候这两部分服务可以在一个应用中,也可以部署再不同应用中,并且允许多个资源服务共享同一个授权服务。获取Token的请求,被Spring MVC controller endpotint处理;而获取资源的请求被标准的Spring Security request filter处理。要实现一个OAuth 2.0 授权服务器,Spring Security filter chain要求以下endpoints:

  • AuthorizationEndpoint用于响应授权请求,默认URL为/oauth/authorize
  • TokenEndpoint用于响应获取Token的请求,默认URL为/oauth/token

OAuth 2.0 Resource Server 要求实现以下filter:

  • OAuth2AuthenticationProcessingFilter通过已授权的access token,加载授权信息

授权服务器配置(Authorization Server Configuration)

主要进行3项配置:

  • ClientDetailsServiceConfigurer:配置客户端信息服务
  • AuthorizationServerSecurityConfigurer:配置token相关endpoint的设置
  • AuthorizationServerEndpointsConfigurer:配置授权和token的endpoint,以及token service

配置客户端信息

ClientDetailsServiceConfigurer用于配置一个内存实现或JDBC实现的client details service.其包含的一些重要信息包括:

  • clientId: 必需,客户端ID
  • secret : 对于信任的客户端必需
  • scope : 客户端允许访问资源的范围,如果该字段未定义或为空,则客户端访问范围不受限制。
  • authorizedGrantTypes: 指定客户端支持的grant_type
  • authorities: 客户端所拥有的Spring Security的权限值

管理Tokens

AuthorizationServerTokenServices用于定义管理OAuth 2.0 Token的相关操作。有几点需要注意:

  • 当access token被创建的时候,授权信息必须被储存起来。以便于Resource Server接受access token的时候,能够获取到相应的授权信息。
  • access token用于加载创建该token的授权信息。

当你考虑创建自己的AuthorizationServerTokenServices时,可以考虑使用DefaultTokenServices,它包含许多策略用于生成和管理token,但它不包含持久化token的实现。持久化token的实现依托于一个TokenStore,默认的是一个内存中的实现版本,同时包含其他的实现:

  • 默认的InMemoryTokenStore对于单台服务器的实现,是一个很好的选择
  • JdbcTokenStore是一个JDBC版本的实现。要使用JdbcTokenStore,你需要引用spring-jdbc库。
  • JSON Web Token (JWT)版本的实现,将所有的信息编码到token本身之中。这个实现的夜歌弊端在于,你不能轻易的使token失效。所以其一般配以较短的失效时间,而失效时再refresh token中处理。另一个弊端是,如果存储了过多的用户信息在token中,该token可能变得十分庞大。从这个意义上来说JwtTokenStore并不是一个真正的Store,因为其并不持久化任何数据,但其处理了token与授权信息之间的转换工作。

JWT Tokens

要使用JWT tokens,你需要在授权服务器有一个JwtTokenStore实现,其依赖于JwtAccessTokenConverter,同时在资源服务器上,需要有一个与授权服务器相同的JwtAccessTokenConverter实现,来进行转换。token默认需要进行签名,这样资源服务器要有一个相应的验签秘钥,来进行验签工作。public key通过授权服务器的/oauth/token_key进行暴露,该URL默认拒绝一切来源的访问。你可以通过标准的SpEL表达之注入AuthorizationServerSecurityConfigurer来打开该URL的访问。

要使用JwtTokenStore,需要引入库spring-security-jwt

Grant Types

可通过AuthorizationServerEndpointsConfigurer配置AuthorizationEndpoint支持的grant type。以下设置会影响grant type:

  • authenticationManager: 注入一个AuthenticationManager后,password grant将打开
  • userDetailsService:如果注入了一个UserDetailsService,refresh token grant将对用户状态进行校验,以保证用户处于激活状态
  • authorizationCodeServices
  • implicitGrantService
  • tokenGranter

强制使用SSL

对于/authorize端点,你可以当成普通的程序来进行保护;对于/token端点,在AuthorizationServerEndpointsConfigurer中可设置sslOnly()来强制使用SSL

个性化UI

授权服务器的大部分请求都是在机器之间进行,需要进行UI定制的主要包含两个:

  • 对于 /oauth/confirm_access 的GET请求
  • 对于 /oauth/error 的HTML响应

在Spring Security OAuth中,提供了这两个页面的简单实现,但是对于实际应用,基本都需要定制其UI以及页面内容。

修改这两个页面只需要提供标准的Spring MVC controller,并将@RequestMappings指向相应的URL。Spring Security OAuth的默认实现将会有较低的优先级截取相应的请求,从而达到个性化相应页面的效果。

/oauth/confirm_access的请求中,你将获得一个AuthorizationRequest,其包含了所有相关数据(默认实现在WhitelabelApprovalEndpoint中,可以参考其进行修改)。你可以对请求进行任何处理,处理完成后,需要将处理结果POST至/oauth/authorize

资源服务器配置(Resource Server Configuration)

你可以通过@Configuration中的@EnableResourceServer,来使用Spring OAuth保护资源服务器上的资源。具体的配置可使用ResourceServerConfigurer完成,其可指定以下配置:

  • tokenServices: 指定tokenService(ResourceServerTokenServices的实例)
  • resourceId: 资源的Id号(可选,但是建议使用,提供的话,授权服务器会进行校验)
  • 资源服务器的其他可拓展节点(例如tokenExtractor可从请求中抽取出token)
  • 获取保护资源的规则
  • 其他在Spring Security的HttpSecurity中允许的配置

@EnableResourceServer将自动添加一个OAuth2AuthenticationProcessingFilter到Spring Security 的Filter Chain。

OAuth 2.0 Client

Protected Resource Configuration

被OAuth保护的资源可以被类型为OAuth2ProtectedResourceDetails的bean定义。其包含一下性质:

  • id: 资源id,其仅仅在客户端被使用,用于标记资源
  • clientId:OAuth client id,用于OAuth provider区分客户端
  • clientSecret: 与资源相关联
  • accessTokenUri: 获取access token的uri
  • scope:客户端获取资源的范围
  • clientAuthenticationScheme: 客户端访问token端点的scheme类型,建议值有http_basic,form,默认为http_basic

Client Configuration

对于OAuth 2.0客户端,只需要使用@EnableOAuth2Client即可,其会完成两个事情:

  • 创建一个filter bean(ID为oauth2ClientContextFilter)来存储当前的请求和上下文。当需要获得授权时,其将请求重定向到授权URI。
  • 在请求中创建一个AccessTokenRequest对象,用户存储授权码等相关内容。

获取被保护的资源

建议使用RestTemplate来获取被保护的资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值