【问题标题】:How does Spring Security/OAuth figure out the AuthenticationPrincipalSpring Security/OAuth 如何找出 AuthenticationPrincipal
【发布时间】:2015-10-22 08:35:07
【问题描述】:
我有一个 spring 项目,它使用 spring-oauth2 和 spring-security 进行身份验证,使用 LDAP 身份验证提供程序。
在控制器中,我可以使用 @AuthenticationPrincipal 注释访问当前主体的 UserDetails。
但是,当我使用 client_credential 令牌访问端点时,@AuthenticationPrincipal 是 String,它是 OAuth 客户端 ID。我知道当您使用 client_credentials 进行身份验证时没有用户的概念,但我想让我的 Principal 成为更丰富的数据类型。 spring 如何决定将我的主体设置为String,我可以覆盖该行为吗?
【问题讨论】:
标签:
spring
spring-mvc
spring-security
oauth-2.0
spring-security-oauth2
【解决方案1】:
来自 Oauth2 规范
客户端凭据(或其他形式的客户端身份验证)可以
当授权范围为
仅限于受客户控制的受保护资源,
或授权之前安排的受保护资源
服务器。客户端凭据用作授权授予
通常当客户代表自己行事时(客户是
也是资源所有者)或正在请求访问受保护的
资源基于先前安排的授权
授权服务器。
因为客户端也可以是资源所有者,所以spring会根据你的客户端信息创建认证。
我假设您已经设置了org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter,它用于为客户端创建身份验证。
您可以创建自己的自定义org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService 或创建自己的org.springframework.security.authentication.AuthenticationProvider 来覆盖身份验证对象的创建方式,但我更喜欢使用org.springframework.security.oauth2.provider.token.TokenEnhancer 向生成的令牌添加额外信息。