2016-11-22 1 views
1

Ich versuche, einen Benutzer von Facebook zu authentifizieren und speichern Sie seinen Benutzernamen und bieten benutzerdefinierte Berechtigung für eine Teilmenge von Benutzern, die Administrator für meine Anwendung werden. Meine Frage ist, wie ich benutzerdefinierte authentifizierte Rollen wie "Admin" zur Verfügung stelle und sie in Oauth2Client autorisiere.Change Authorities/Rollen des authentifizierten Benutzers von SSO im Frühjahr OAuth2-Client

@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 + "'"); 
      } 
     } 
    }; 
} 
} 

Ich möchte ähnliche Dinge mit OAuth2 Client tun.

Dank

Antwort

0

Was Sie brauchen, ist Implementierung individuelle UserInfoTokenServices mit Ihrem ersistence Repository als Argument und dann in Ihrem Facebook-Filter die benutzerdefinierten UserInfoTokenServices wie diese insted defaul verwenden:

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; 
} 

als Ihre individuelle UserInfoTokenServices Sie können Ihren eigenen AuthoritiesExtractor wie diesen hinzufügen private AuthoritiesExtractor authoritiesExtractor = new CustomSocialAuthoritiesExtractor(); Dort können Sie Ihre DB-Abfrage oder jede Logik ausführen, um Ihre benutzerdefinierte Autorität zu holen und an Ihre Kunden weiterzugeben.

this helps

0

Sie neccessaraly ein CustomSocialUserInfoTokenServices nicht brauchen. Stattdessen könnten Sie vorhandene UserInfoTokenServices verwenden und Ihren CustomSocialAuthoritiesExtractor festlegen.

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

Sie können es noch einfacher, wenn Sie Ihre eigene UserInfoTokenServices nicht zur Verfügung stellen möchten. Stellen Sie einfach eine AuthoritiesExtractor-Bean in Ihrer Sicherheitskonfiguration bereit.

@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); 
    } 
} 

Weitere Informationen finden Sie in diesem Tutorial: https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_logout

Verwandte Themen