如何将OAuth 2令牌映射到资源服务器中的UserDetails对象?

我有2个单独的Spring Boot应用程序,一个充当OAuth

2授权服务器,另一个充当资源服务器。我RemoteTokenServices在资源服务器中使用Spring的服务器来检查授权服务器中的令牌。现在,我正在尝试在资源服务器应用程序中定义受保护的控制器代码,但不确定如何将UserDetails类映射到通过OAuth

2机制提供的身份验证主体。

我已经使用一个自定义设置了授权服务器,该自定义TokenEnhancer向令牌添加了更多详细信息,以便/oauth/check_token?token=<token>返回带有自定义字段的返回值,我想将该字段映射到我的资源服务器控制器。

在授权服务器也是资源服务器的更加单一的设置中,我可以定义通过以下方式使用已认证主体的控制器方法:

//User implements UserDetails

public Map<String, Object> getResource(@AuthenticationPrincipal User user) {

//code that uses the user object

}

但是,在更分布式的方法中,这似乎不那么简单。映射失败,并且该user参数最终成为空对象。我尝试使用以下方法:

public Map<String, Object> getResource(Authentication authentication) {

//code that uses the authentication object

}

虽然上面的代码成功映射了身份验证详细信息,但它没有为我提供直接访问通过TokenEnhancer前面提到的I

设置的自定义字段的方法。我似乎无法从Spring文档中找到与此相关的任何内容。

回答:

为了解决这个问题,让我先介绍一下建筑背景。通过进行UserDetails自动映射的对象@AuthenticationPrincipal来自principal活动Authentication对象的字段。资源服务器控制器仅通过将其声明为方法参数的一部分即可访问OAuth2Authencation对象,该对象是AuthenticationSpring

OAuth2安全框架的专用实例。

public void controllerMethod(OAuth2Authentication authentication) {

//controller definition

}

知道了这一点,问题现在转移到如何确保对象中的getPrincipal()方法Authentication是我的自定义UserDetails类的实例。将RemoteTokenServices在资源服务器应用程序使用我的使用实例AccessTokenConverter来解释该授权服务器发送令牌的详细信息。默认情况下,它使用DefaultAccessTokenConverter,它只是将身份验证主体设置为用户名,即用户名String。此转换器利用UserAuthenticationConverter将来自授权服务器的数据转换为的实例Authentication。这是我需要自定义的内容:

DefaultAccessTokenConverter tokenConverter = new DefaultAccessTokenConverter();

tokenConverter.setUserTokenConverter(new DefaultUserAuthenticationConverter() {

@Override

public Authentication extractAuthentication(Map<String, ?> map) {

Authentication authentication = super.extractAuthentication(map);

// User is my custom UserDetails class

User user = new User();

user.setSpecialKey(map.get("specialKey").toString());

return new UsernamePasswordAuthenticationToken(user,

authentication.getCredentials(), authentication.getAuthorities());

}

});

tokenServices.setAccessTokenConverter(tokenConverter);

通过所有这些设置,该@AuthenticationPrincipal机制现在可以按预期工作。

以上是 如何将OAuth 2令牌映射到资源服务器中的UserDetails对象? 的全部内容, 来源链接: utcz.com/qa/426099.html

回到顶部