首页 > 解决方案 > Spring OAuth2.0:根据ClientId(授权码授予类型)获取用户角色

问题描述

我为 AuthServer 设置了 spring boot OAuth,它可以使用 spring-security-jwt 为一些资源服务器提供身份验证服务。我的问题是在进行身份验证时我需要加载用户的角色,但特定于 clientId。例如:如果 user1 有角色 ROLE_A、ROLE_B 用于 client1 和 ROLE_C、ROLE_D 用于 client2,那么当用户使用 client1 或 client2 登录时,他能够看到所有四个角色,即。ROLE_A, ROLE_B, ROLE_C, ROLE_D 因为我正在根据用户名获取角色。如果我需要基于客户端的角色,那么我需要 clientId。仅供参考,我正在使用授权代码流进行身份验证。我见过类似的问题,但这是基于密码授予,但我正在尝试授权代码流,该解决方案对我不起作用。密码授予问题链接

下面是我需要 clientId
MyAuthenticationProvider.java的代码

@Override
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
        String userName = ((String) authentication.getPrincipal()).toLowerCase();
        String password = (String) authentication.getCredentials();
        String clientId = ? // how to get it
        ....
    }
}

MyUserDetailsS​​ervice.java

@Override
    public UserDetails loadUserByUsername(String username) {
        String clientId = ? // how to get it 
        ....
    }
}

标签: spring-bootjwtspring-security-oauth2

解决方案


您可能需要在 Spring-security 中查看 OAuth2Authentication。当您的客户端通过 oauth2 身份验证时,您的“身份验证”实际上是最终实现身份验证的 OAuth2Authentication 实例。

如果你看到 OAuth2Authentication 的实现,它的完成如下;

    public Object getPrincipal() {
       return this.userAuthentication == null ? this.storedRequest.getClientId() : this.userAuthentication
            .getPrincipal();
    }

因此,如果请求包含“clientId”,那么只要您的请求不包含用户身份验证,您就应该能够通过调用 getPrincipal() 并将类型转换为 String 来获取 clientId。

对于您的第二种情况,用户名实际上被视为 clientId。您需要调用内存中、RDBMS 或任何存储了 clientId 并返回 ClientDetails 的实现。通过查看 Spring security 的 ClientDetailsUserDetailsS​​ervice 类,您将能够有所了解。


推荐阅读