2016-11-22 10 views
1

私はFacebookのユーザを認証し、ユーザ名を保存し、自分のアプリケーションの管理者になるユーザのサブセットにカスタム権限を与えようとしています。私の質問は、認証されたユーザーに「管理者」のようなカスタムロールを提供し、Oauth2Clientで権限を付与する方法です。Spring OAuth2クライアントでSSOから認証されたユーザの権限/ロールを変更する

@Configuration 
class WebSecurityConfiguration extends GlobalAuthenticationConfigurerAdapter { 

@Autowired 
UserRepository userRepository; 

@Override 
public void init(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService()); 

} 

@Bean 
UserDetailsService userDetailsService() { 
    return new UserDetailsService() { 
     @Override 
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
      User account = userRepository.findOne(username); 
      if (account != null) { 
       List<String> rolesList = userRepository.getRoles(username); 
       String[] roles = new String[rolesList.size()]; 


       // userRepository.findRoles List<String> roles = 
       //account.getUserroles().; 
       User user = new User(account.getUserssoid(), account.getSecretKey(), true, true, true, true, 
         AuthorityUtils.createAuthorityList(rolesList.toArray(roles))); 

       return user; 
      } else { 
       throw new UsernameNotFoundException("could not find the user '" + username + "'"); 
      } 
     } 
    }; 
} 
} 

OAuth2クライアントを使用して同様のことをしたいと思います。

おかげで、あなたが必要なもの

答えて

0

は、引数としてごersistenceリポジトリを持つカスタムUserInfoTokenServices実装され、その後、自分のFacebookのフィル​​タでカスタムUserInfoTokenServicesを使用するには、次のようにdefaulのinsted:

private Filter ssoFilter() { 
    CompositeFilter filter = new CompositeFilter(); 
    List<Filter> filters = new ArrayList<>(); 
    filters.add(ssoFilter(facebook(), "/login/facebook")); 
    filters.add(ssoFilter(google(), "/login/google")); 
    filter.setFilters(filters); 
    return filter; 
} 

private Filter ssoFilter(ClientResources client, String path) { 
    OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path); 
    OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext); 
    filter.setRestTemplate(template); 
    CustomSocialUserInfoTokenServices tokenServices = new CustomSocialUserInfoTokenServices(
      client.getResource().getUserInfoUri(), client.getClient().getClientId(), userRepository); 
    tokenServices.setRestTemplate(template); 
    filter.setTokenServices(tokenServices); 

    return filter; 
} 

をカスタムUserInfoTokenServicesされているよりもカスタムAuthoritiesExtractorを次のように追加できます。 private AuthoritiesExtractor authoritiesExtractor = new CustomSocialAuthoritiesExtractor(); DBクエリまたはロジックを実行してカスタムオーソリティを取得し、クライアントに渡すことができます。

・ホープこれはあなたがneccessaraly CustomSocialUserInfoTokenServicesを必要といけない

0

に役立ちます。 代わりに、既存のUserInfoTokenServicesを使用してCustomSocialAuthoritiesExtractorを設定することができました。

private Filter ssoFilter(ClientResources client, String path) { 
    ... 
    UserInfoTokenServices tokenServices = new UserInfoTokenServices(client.getResource().getUserInfoUri(), client.getClient().getClientId()); 
    tokenServices.setRestTemplate(template); 
    tokenServices.setAuthoritiesExtractor(new CustomSocialAuthoritiesExtractor()); 
    filter.setTokenServices(tokenServices); 

return filter; 

}

public class CustomSocialAuthoritiesExtractor implements AuthoritiesExtractor { 
    @Override 
    public List<GrantedAuthority> extractAuthorities(Map<String, Object> map) { 
    String authorities = "ROLE_CUSTOMUSER"; 

    return AuthorityUtils.commaSeparatedStringToAuthorityList(authorities); 
    } 
} 
0

独自のUserInfoTokenServicesを提供したくないときは、さらに簡単にそれを行うことができます。セキュリティ設定でAuthoritiesExtractor Beanを提供するだけです。詳細については

@Bean 
public AuthoritiesExtractor customAuthoritiesExtractor() { 
    return new CustomAuthoritiesExtractor(); 
} 

public class CustomAuthoritiesExtractor implements AuthoritiesExtractor { 

    @Override 
    public List<GrantedAuthority> extractAuthorities(Map<String, Object> map) { 

     // map contains information from your OAuth profile provider 

     boolean userExist = true; // TODO 
     if (!userExist) { 
      throw new BadCredentialsException("User does not exists"); 
     } 

     String authorities = "ROLE_ADMIN"; // TODO your own roles 
     return AuthorityUtils.commaSeparatedStringToAuthorityList(authorities); 
    } 
} 

このチュートリアルを参照してください。https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_logout

関連する問題