2017-10-13 7 views
0

私は単純な春のブートアプリケーションを持っており、私はそれでGoogleのoauth2認証を使用するwnat。それは正常に動作しますが、自分のuserDetailsS​​erviceを設定してユーザーのロールを設定する方法がわかりません。私はUserDetailsS​​erviceの私のimplemantationを喜ばなければならないSpring Boot + Google OAuth2:ユーザー詳細サービスの定義方法

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 

ので、:

マイ設定:

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

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

...とapplication.properties?コンテキストにBeanを追加するだけでうまくいかない場合は、おそらくどこかに設定する必要があります。 ありがとう

答えて

0

これを解決する最善の方法であるかどうかわかりませんが、動作します。 データベースからユーザー権限を取得する新しいセキュリティフィルターを追加しました。 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; 
} 

当局フィルタ:

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; 
     } 
    } 
関連する問題