2017-10-13 8 views
0

J'ai simple application de démarrage de printemps et je wnat d'utiliser l'authentification google oauth2 en elle. Cela fonctionne très bien, mais je ne comprends pas comment définir mon propre userDetailsService pour définir des rôles pour les utilisateurs.Spring Boot + Google OAuth2: comment définir le service de détails de l'utilisateur?

Ma config:

@SpringBootApplication 
@EnableWebMvc 
@EnableOAuth2Sso 
public class Application extends WebMvcAutoConfiguration { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

... et application.properties:

security.oauth2.client.client-id: <client-d> 
security.oauth2.client.client-secret: <secret> 
security.oauth2.client.access-token-uri: https://www.googleapis.com/oauth2/v3/token 
security.oauth2.client.user-authorization-uri: https://accounts.google.com/o/oauth2/auth 
security.oauth2.client.client-authentication-scheme: form 
security.oauth2.client.scope: profile,email 
security.oauth2.resource.user-info-uri: https://www.googleapis.com/userinfo/v2/me 
security.oauth2.resource.prefer-token-info: false 

Alors, où dois-je faire plaisir à ma implemantation de UserDetailsService? Juste ajouter le haricot au contexte ne fonctionne pas, il devrait probablement mettre quelque part, mais où? Merci

Répondre

0

Je ne sais pas si c'est la meilleure façon de résoudre ce problème, mais cela fonctionne. J'ai ajouté un nouveau filtre de sécurité, où les autorités d'utilisateur sont extraites de la base de données. classe Application:

@Autowired 
private UserRepository userRepository; 

@Bean 
public FilterRegistrationBean filterRegistrationBean() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    AuthoritiesFilter filter = new AuthoritiesFilter(); 
    filter.setUserRepository(userRepository); 
    registration.setFilter(filter); 
    registration.addUrlPatterns("/*"); 
    registration.setName("authoritiesFilter"); 
    registration.setOrder(Ordered.LOWEST_PRECEDENCE); 
    return registration; 
} 

Autorités Filtre:

public class AuthoritiesFilter extends GenericFilterBean { 
     public static final String EMAIL = "email"; 
     public static final String NAME = "name"; 
     public static final String GIVEN_NAME = "given_name"; 
     public static final String FAMILY_NAME = "family_name"; 
     public static final String PICTURE = "picture"; 
     public static final String GENDER = "gender"; 
     public static final String LOCALE = "locale"; 

     private UserRepository userRepository; 

     @Override 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
      OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; 

      if (oAuth2Authentication != null && oAuth2Authentication.getUserAuthentication().getDetails() != null) { 
       SecurityContextHolder.getContext().setAuthentication(processAuthentication(authentication)); 
      } 

      chain.doFilter(request, response); 
     } 

     private OAuth2Authentication processAuthentication(Authentication authentication) { 
      OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; 
      Map<String, String> details = (Map<String, String>) oAuth2Authentication.getUserAuthentication().getDetails(); 

      User user = userRepository.getByEmail(details.get(EMAIL)) 
        .orElse(new User()); 
      updateUser(user, details); 
      userRepository.save(user); 

      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
        oAuth2Authentication.getPrincipal(), 
        oAuth2Authentication.getCredentials(), 
        user.getAuthorities().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())); 
      oAuth2Authentication = new OAuth2Authentication(oAuth2Authentication.getOAuth2Request(), token); 
      oAuth2Authentication.setDetails(details); 
      return oAuth2Authentication; 
     } 

     private void updateUser(User user, Map<String, String> details) { 
      user.setEmail(details.get(EMAIL)); 
      user.setName(details.get(NAME)); 
      user.setGivenName(details.get(GIVEN_NAME)); 
      user.setFamilyName(details.get(FAMILY_NAME)); 
      user.setPicture(details.get(PICTURE)); 
      user.setGender(details.get(GENDER)); 
      user.setLocale(details.get(LOCALE)); 
     } 

     public void setUserRepository(UserRepository userRepository) { 
      this.userRepository = userRepository; 
     } 
    }