OAuth2在CustomUserDetailsS​​ervice中检索client_id

时间:2018-01-05 13:54:08

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

我创建了一个配置为我的授权服务器oauth2的Spring Boot应用程序,让其他应用程序Spring启动,配置为Client oauth2。

在我的服务器中,我实现了CustomUserDetailsS​​ervice,我想在loadUserByUsername方法中检索正在验证的项目的client_id。

我不知道这是否可行,但我想恢复它以验证client_id,因为我有几个使用相同授权器的应用程序,而client_id我将检查用户是否有权访问该应用程序。

有谁知道怎么做?

application.yml 客户端

security:
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      clientId: web_app
      clientSecret: secret
      accessTokenUri: https://localhost/uaa/oauth/token
      userAuthorizationUri: https://localhost/uaa/oauth/authorize

CustomUserDetailsS​​ervice

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try {

            //I would like to recover the client_id in this location

            User domainUser = userRepository.findByUsername(username);

必须验证任何服务器,因为我只有一个登录所有应用程序:

Auth服务器身份验证由用户和密码以及应用程序完成。

想象一下,您正在登录" https://accounts.google.com/"谷歌检查用户和密码,并显示您的帐户的快捷方式"产品"。

现在,如果您访问" https://mail.google.com"谷歌检查用户和密码并显示Gmail界面。在我的情况下,它可以来自网址https://application.domain.comhttps://application2.domain.comhttps://application3.domain.com或" https://accounts.domain.com

它使用用户名和密码的所有网址,但它可以访问application1或全部或不访问。

我想做服务器端,因为它仅为具有权限(信用)的应用程序返回访问令牌。如果用户和密码正确,则并不意味着用户可以访问所有应用程序。

2 个答案:

答案 0 :(得分:0)

要访问client_id,您需要实现不同的接口。 CustomUserDetailsService只会授予您访问User对象的权限。

我没有在Spring Boot中执行此操作的确切方法,但在基于XML的配置中,您必须执行以下操作

public class CustomJdbcClientDetailsService implements 
       ClientDetailsService, ClientRegistrationService {

       @Override
       public CustomClientDetails loadClientByClientId(String clientId)
              throws InvalidClientException {
           //Do something with clientId 
       }
}

简而言之,方法loadClientByClientId可让您访问客户端ID。还有其他方法可以拦截不同的Spring OAuth2类并访问client_id,但这是最干净和推荐的方法。

您也可以通过添加client_id来拦截请求并检查正文,从而访问Filter

您需要对如何在ClientDetailsService中实施ClientRegistrationServiceSpring Boot进行一些研究。有很多关于它的教程。

最好从谷歌搜索如何使用ClientDetailsServiceConfigurer设置Spring Boot

  1. 有关ClientDetailsServiceConfigurer的更多信息,请参阅Spring OAuth Java Doc
  2. A good tutorialthis one

答案 1 :(得分:0)

final SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
if (null != savedRequest) {
    final String redirectUrl = savedRequest.getRedirectUrl();
    final MultiValueMap parameters = UriComponentsBuilder.fromUriString(redirectUrl).build().getQueryParams();
    if (parameters.containsKey("client_id")) {
        final String clientId = parameters.get("client_id").get(0);
    }
}