Spring Security / OAuth如何找出AuthenticationPrincipal

时间:2015-07-30 20:05:29

标签: spring spring-mvc spring-security oauth-2.0 spring-security-oauth2

我有一个spring项目,它使用spring-oauth2和spring-security进行身份验证,使用LDAP身份验证提供程序。

在控制器中,我可以使用UserDetails注释访问当前主体的@AuthenticationPrincipal

但是,当我使用client_credential令牌点击端点时,@AuthenticationPrincipalString,这是OAuth客户端ID。我知道在使用client_credentials进行身份验证时没有用户的概念,但我希望我的Principal是一个更丰富的数据类型。 Spring如何决定将我的主体设置为String并且我可以覆盖该行为吗?

1 个答案:

答案 0 :(得分: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向生成的令牌添加其他信息