I have 2 separate Spring Boot applications, one serving as an an OAuth 2 authorization server, and the other as resource server. I'm using Spring's RemoteTokenServices
in my resource server to check tokens from the authorization server. Now, I'm trying to define protected controller code in my resource server application, but I'm not sure how to map the UserDetails
class to the authentication principal provided through the OAuth 2 mechanism.
I have set up my authorization server with a custom TokenEnhancer
that adds more details to the token such that /oauth/check_token?token=<token>
returns with custom fields, which I want to map to my resource server controllers.
In a more monolithic setup where the authorization server is also the resource server, I can define controller methods that make use of the authenticated principal this way:
//User implements UserDetails
public Map<String, Object> getResource(@AuthenticationPrincipal User user) {
//code that uses the user object
}
However, this doesn't seem to work as straight forward in a more distributed approach. The mapping fails, and the user
parameter ends up being a null object. I tried using the following approach:
public Map<String, Object> getResource(Authentication authentication) {
//code that uses the authentication object
}
While the code above successfully maps the authentication details, it doesn't provide a way for me to directly access the custom fields I've set through the TokenEnhancer
I mentioned earlier. I can't seem to find anything from the Spring docs regarding this.