项目中遇到的一些问题总结(十一)

OAuth2是一种授权框架,定义了资源拥有者如何授权客户端访问受保护资源。SpringSecurityOAuth2中的AuthorizationServerConfigurerAdapter用于配置OAuth2授权服务,包括安全性、客户端详细信息和服务端点。AuthorizationServerEndpointsConfigurer则涉及认证管理器、令牌服务和端点请求方法等。ClientDetailsServiceConfigurer配置客户端详情,确保只有批准的客户端能接入。微信扫码登录返回的unionid用于识别用户在不同应用中的身份。
摘要由CSDN通过智能技术生成

OAuth2

OAuth2是一种授权框架,由IETF标准化RFC 6749和RFC 6750规范。它定义了如何通过授权从资源拥有者获取访问受保护资源的方法。

OAuth2的主要角色包括:

1.资源拥有者(Resource Owner):通常是指最终用户,即授权数据访问的主体。

2.客户端(Client):代表资源拥有者发起对资源服务器的请求

3.授权服务器(Authorization Server):也叫认证服务器,负责对客户端进行身份验证和资源拥有者的授权请求,并令牌颁发给客户端,以获取受保护的资源的访问令牌。

4.资源服务器(Resource Server):托管受保护资源的服务器,如果持有有效的访问令牌,则可以访问令牌允许的资源。

OAuth2的核心概念主要包括:

  1. 访问令牌(Access Token):授权服务器颁发给客户端的令牌,用于访问受保护资源。访问令牌在一定时间内有效,通常具有访问令牌范围(scope)和授权类型(grant type)等属性。

  2. 授权码(Authorization Code):当客户端需要访问资源时,需要向授权服务器请求授权,授权服务器会为客户端生成一个授权码,客户端通过授权码向授权服务器请求访问令牌。

  3. 客户端凭证(Client Credentials):客户端向授权服务器进行身份验证并获取访问令牌。客户端凭证通常包括客户端ID和客户端密钥等信息。

  4. 授权范围(Scope):在授权请求中指定的特定权限范围,用于限定访问令牌的使用范围。

  5. 授权类型(Grant Type):用于指定授权类型的字符串,包括授权码授权、客户端凭证授权、密码授权等。

OAuth2框架被广泛应用于Web开发中,例如开发基于第三方登录和授权的应用程序、通过API调用其他服务来访问受保护资源等。

AuthorizationServerConfigurerAdapter

public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {

	@Override
	public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
	}

	@Override
	public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
	}

	@Override
	public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
	}

} 

AuthorizationServerConfigurerAdapterSpring Security OAuth2 的一个配置适配器,实现 AuthorizationServerConfigurer 接口,用来配置 OAuth2 授权服务。

它提供了三个方法:

  1. configure(AuthorizationServerSecurityConfigurer security)

    用于配置 OAuth2 授权服务器的安全性,例如配置令牌端点(token endpoint)的访问权限规则,以及客户端访问授权服务端点的方式等。

    参数:

    • securityAuthorizationServerSecurityConfigurer 类型,用于配置 OAuth2 授权服务器的安全性。
  2. configure(ClientDetailsServiceConfigurer clients)

    用于配置客户端详细信息服务(ClientDetailsService),例如配置客户端ID、客户端密钥、授权许可类型、授权范围、重定向URI等。

    参数:

    • clientsClientDetailsServiceConfigurer 类型,用于配置客户端详细信息服务。
  3. configure(AuthorizationServerEndpointsConfigurer endpoints)

    用于配置授权服务器端点(endpoints),例如配置认证管理器(authentication manager)、授权管理器(authorization manager)、令牌存储(token store)、授权码存储(authorization code store)等。

    参数:

    • endpointsAuthorizationServerEndpointsConfigurer 类型,用于配置授权服务器端点。

这三个方法是非常重要的,可以根据需要进行自定义配置,以满足合适的授权服务需求。

适配器是什么?

在编程中,适配器(Adapter)是一种设计模式,它允许将已存在的类的接口转换为目标类所需要的接口。适配器作为中间件用于链接两个不兼容的对象,这些对象具有接口不兼容的问题。

适配器主要解决在类库的使用过程中,新旧版本之间接口不兼容的问题,由于实现了相同的接口,因此在使用过程中可以实现透明,降低了客户程序的开发成本,也方便与业务逻辑进行解耦。

在 Spring 中,适配器模式也有很多应用场景,比如我们常用的 HandlerAdapter 在处理请求时选择相对应的 Handler 进行处理,又比如 HandlerInterceptorAdapter 在拦截请求前后可以在 Handler 的执行过程中进行前置和后置处理,这些都是适配器模式的应用。而且 Spring 还提供了许多配置适配器来对不同的环境和需求进行相应的配置,如 Security 配置适配器 WebSecurityConfigurerAdapter、OAuth2 配置适配器 AuthorizationServerConfigurerAdapter 等等。

适配器是一种设计模式,它可以帮助我们解决新旧版本之间接口不兼容的问题,使得新的代码可以和旧的代码协同工作,而不需要修改旧的代码。比如,我们可能需要使用一个提供了新功能的类库,但是这个类库的接口是和我们之前使用的类库不一致的,这时候我们就可以使用适配器来将新的类库接口转换为我们期望的接口,这样就可以在不改变原有代码的情况下使用新的类库,提高了代码的复用性和灵活性,也减少了代码的维护成本。在 Spring 中也广泛应用了适配器模式,帮助我们解决了许多配置和框架集成的问题。

拿手机充电器来举例子,假如你有一部手机是苹果的,但是你朋友只有安卓的充电器,你就可以使用一个充电器适配器来将安卓充电器转换为苹果手机的充电口,这样你就能够使用朋友的安卓充电器给自己的苹果手机充电了。适配器其实就是一个连接器,它可以让不兼容的两个部分能够协调工作,而不需要修改原有的部分。这就是适配器模式,在软件开发中,可以使用这个模式来解决新旧版本之间接口不兼容的问题,实现代码的复用和灵活性。

AuthorizationServerEndpointsConfigurer 介绍

AuthorizationServerEndpointsConfigurer 是 Spring Security OAuth2 中的一个配置类,用于配置 OAuth2 认证服务器的终端点。

具体来讲,OAuth2 认证服务器包含许多终端点用于处理认证和授权请求,例如获取 access token、refresh token、授权码、校验 token 等,而 AuthorizationServerEndpointsConfigurer 类就提供了一系列方法来对这些终端点进行配置,使得 OAuth2 认证服务器在处理这些请求时能够按照我们的需要进行处理。

常用的终端点的配置方法如下:

  • authenticationManager(AuthenticationManager authenticationManager):设置认证管理器。 设置后,将支持 password 授权类型,并验证来自客户端的用户名和密码。
  • tokenServices(AuthorizationServerTokenServices tokenServices):用于设置令牌管理服务。可以使用 Spring Security 提供的默认实现,也可以使用自定义实现。
  • exceptionTranslator(WebResponseExceptionTranslator exceptionTranslator):配置异常处理程序,用于在抛出异常时将异常信息转换为更友好的信息。
  • pathMapping():配置不同终端点的 URL。例如,.pathMapping("/oauth/authorize", "/custom/authorize")oauth/authorize 的 URL 映射为 custom/authorize
  • allowedTokenEndpointRequestMethods(HttpMethod... allowedMethods):设置允许访问令牌的请求方法,例如 POSTGET 等。
  • userApprovalHandler(UserApprovalHandler userApprovalHandler): 配置用户授权处理程序,用于处理用户是否同意授权等操作。

总之,AuthorizationServerEndpointsConfigurer 提供了一系列方法,用于配置 OAuth2 认证服务器的各个终端点和参数,从而实现符合我们的需求的认证服务。

@Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .authenticationManager(authenticationManager)//认证管理器
                .tokenServices(authorizationServerTokenServices)//令牌管理服务
                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
    } 

上述代码是 Spring Security OAuth2 授权服务器配置的一部分,用于配置授权服务器的端点,其中包括:

  1. authenticationManager:指定认证管理器,用于验证用户的身份。在这里,可能是一个自定义的实现,或者使用默认的 ProviderManager 认证管理器。

  2. tokenServices:指定令牌管理服务,用于管理令牌。Spring Security OAuth2 框架提供了多种实现,例如 DefaultTokenServices 或者 JwtTokenServices。开发者可以根据实际情况选择。

  3. allowedTokenEndpointRequestMethods:指定允许的请求方法,这里只允许 POST 方法来获取令牌。

这些端点是实现 OAuth2 授权服务器的几个核心端点,包括:

  • /oauth/authorize:授权端点,用于获取授权码或者令牌。
  • /oauth/token:令牌端点,用于获取访问令牌。
  • /oauth/check_token:用于检查访问令牌的有效性。
  • /oauth/confirm_access:用户确认授权页面,用于确认授权。
  • /oauth/error:授权服务错误页面。

以上是对于参数的简短解释,还有其他的参数需要根据具体需求选择配置。

authenticationManager(authenticationManager) 这个是不是使用SpringSecurity框架进行认证

是的,authenticationManager 参数使用的是 Spring Security 框架进行认证。在 Spring Security 中,AuthenticationManager 是用于完成身份验证的核心接口,定义了一个认证的方法 authenticate()

在 OAuth2 授权服务器中,authenticationManager 可以用于验证用户的身份是否正确,例如用户名和密码是否匹配等。通常情况下,开发者要根据实际情况来配置 authenticationManager

使用 Spring Security 框架进行身份验证可以使用多种方式,例如使用内存认证、基于 JDBC 的认证、LDAP 认证等。如果系统中已经有一个用户认证系统,也可以集成该系统与 Spring Security 进行整合,以实现用户的统一认证。

在 Spring Security OAuth2 中,authenticationManager 参数是必须配置的,因为获取令牌的过程需要对用户进行身份验证。

终端点是什么

终端点(endpoint)在计算机网络中是指能够与网络进行通信、对外提供特定服务的节点或设备,通常是指网络中的应用程序接口(API)的URL。

在 OAuth2 协议中,终端点指的是 OAuth2 认证服务器提供的一些特定的接口,用于进行各种授权和认证操作,例如:

  • /oauth/authorize:授权端点,用于向资源所有者请求授权。
  • /oauth/token:令牌端点,用于颁发访问令牌和刷新令牌等操作。
  • /oauth/check_token:校验令牌端点,用于校验访问令牌的有效性。
  • /oauth/token_key:令牌公钥端点,用于提供 JWT 令牌公钥的 URL。
  • /oauth/error:授权服务错误页面。

这些终端点通过 HTTP 协议在客户端和 OAuth2 认证服务器之间进行交互,实现了 OAuth2 协议中规定的各种授权和认证操作。在使用 Spring Security OAuth2 时,我们需要配置 AuthorizationServerEndpointsConfigurer 来设置这些终端点的相关参数和选项,以达到我们想要的认证服务。

AuthorizationServerSecurityConfigurer

  @Override
    public void configure(AuthorizationServerSecurityConfigurer security) {
        security
                .tokenKeyAccess("permitAll()")                    //oauth/token_key是公开
                .checkTokenAccess("permitAll()")                  //oauth/check_token公开
                .allowFormAuthenticationForClients()                //表单认证(申请令牌)
        ;
    } 

这段代码是在 Spring Security OAuth2 中用于配置 OAuth2 认证服务器安全性的方法。具体来说,configure(AuthorizationServerSecurityConfigurer security) 方法可以用于配置 OAuth2 认证服务器的安全策略,包括访问令牌和刷新令牌等敏感信息的保护,以及认证客户端等方面。

其中该方法具体配置的内容包括:

  • tokenKeyAccess("permitAll()"):设置 /oauth/token_key 端点的访问权限为公开,即不需要进行身份验证就可以访问该端点,用于提供 OAuth2 认证服务器的公钥。
  • checkTokenAccess("permitAll()"):设置 /oauth/check_token 端点的访问权限为公开,即不需要进行身份验证就可以访问该端点,用于检查访问令牌的有效性。
  • allowFormAuthenticationForClients():允许客户端使用表单进行身份验证,用于申请访问令牌。如果不允许使用表单身份验证,则需要使用 HTTP 基本认证或者 OAuth2 客户端凭证进行身份验证。

通过上述配置,我们可以更加细粒度地控制 OAuth2 认证服务器的安全性,以满足实际应用的需要。如果对 OAuth2 认证服务器的安全性策略进行了合适的配置,我们可以保证 OAuth2 认证服务器的敏感信息不会被泄露,同时也可以防止未授权的访问和攻击。

这个使用表单进行身份认证是什么意思

使用表单进行身份认证是指通过在 Web 表单中输入用户身份信息(如用户名和密码)来进行身份验证的方式。在 Spring Security OAuth2 中,.allowFormAuthenticationForClients() 方法用于允许 OAuth2 客户端使用表单身份认证来获取访问令牌。

通常情况下,OAuth2 客户端需要在请求中发送各种凭证信息,以便在 OAuth2 认证服务器上进行身份验证并获取访问令牌。包括客户端 ID 和客户端密钥等信息。在使用表单身份认证时,客户端需要将这些凭证信息放入 Web 表单中提交给认证服务器进行验证。

在 Spring Security OAuth2 中,可以通过使用 .allowFormAuthenticationForClients() 方法来配置 OAuth2 认证服务器,以支持 OAuth2 客户端使用表单身份认证来获取访问令牌。例如,在使用密码模式时,客户端可以通过表单方式将用户名和密码发送给认证服务器,以获取访问令牌。

需要注意的是,使用表单进行身份认证是一种常见的身份认证方式,但它需要注意安全性问题,以保证用户身份信息在传输和存储过程中的安全性。在配置和使用时,需要遵循相应的安全规范和最佳实践。

ClientDetailsServiceConfigurer

用来配置客户端详情服务(ClientDetailsService),随便一个客户端都可以随便接入到它的认证服务吗?答案是否定的,服务提供商会给批准接入的客户端一个身份,用于接入时的凭据,有客户端标识和客户端秘钥,在这里配置批准接入的客户端的详细信息。

微信扫码登陆参数 unionid

微信扫码登录成功后,返回的参数中包含了用户的openid。由于同一个用户在不同的公众号/小程序中的openid是不一样的,为了方便用户在不同的应用中使用同一个账号登录,微信提供了unionid这个参数,可用于唯一标识一个用户在不同公众号/小程序中的身份。

需要注意的是,只有满足以下条件之一的用户,才能在不同应用中共享同一个unionid:

1.已经关注公众号或已经在小程序中绑定了开发者账号的用户。

2.通过oauth2授权方式同意授权的用户。

3.通过移动应用(如微信APP)登录公众号的用户。

如果不满足以上任意一条,同一个用户在不同应用中的openid和unionid都可能不一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上阡陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值