2017-05-24 18 views
1

私はSpringセキュリティoauth2を使用してプロジェクトを実装していますが、すべて正常に動作します。私は要求を行ったユーザがリソースの実際のユーザの所有者であるかどうかを確認したい、最終的な結果は、例えば次のようになります。認証されたユーザを取得

/プライベート/ユーザー/ {UUID} /クライアントは、指定したユーザーのすべてのクライアントを返します。 。

だから私のコントローラは、次のようになります。より良い説明のための完全なセキュリティコード(作業):

@RestController 
public class HomeController { 

    @Autowired 
    private UserService userService; 

    @GetMapping(value = "/") 
    public String index() { 
     return "Hello world"; 
    } 

    @GetMapping(value = "/private") 
    public String privateTest(Principal principal) { 
     User user = userService.get(principal.getName()); 
     return user.getUuid(); 
    } 

} 

EDIT。

ResourceServerConfig

@Configuration 
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.headers().frameOptions().disable().and() 
       .authorizeRequests() 
       .antMatchers("/","/home","/register","/login").permitAll() 
       .antMatchers("/private/**").authenticated(); 
    } 
} 

CustomUserDetailsオフコースゲッターとセッターと

public class CustomUserDetails implements UserDetails { 

    private Collection<? extends GrantedAuthority> authorities; 
    private String password; 
    private String username; 
    private String uuid; 

    public CustomUserDetails(User user) { 
     this.username = user.getUsername(); 
     this.password = user.getPassword(); 
     this.uuid = user.getUuid(); 
     this.authorities = translate(user.getRoles()); 
    } 
} 

AuthorizationServerConfig

@Configuration 
@EnableAuthorizationServer 
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(authenticationManager); 
    } 
    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory().withClient("my-trusted-client") 
       .authorizedGrantTypes("client_credentials", "password") 
       .authorities("ROLE_CLIENT","ROLE_TRUSTED_CLIENT").scopes("read","write","trust") 
       .resourceIds("oauth2-resource").accessTokenValiditySeconds(5000).secret("secret"); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security.checkTokenAccess("isAuthenticated()"); 
    } 
} 

メイン

@SpringBootApplication 
public class DummyOauthApplication { 

    @Autowired 
    private PasswordEncoder passwordEncoder; 

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

    @Autowired 
    public void authenticationManager(AuthenticationManagerBuilder builder, UserRepository repository, UserService service) throws Exception { 
     //Setup a default user if db is empty 
     if (repository.count() == 0) { 
      service.save(new User("user", "password", UUID.randomUUID().toString(), Arrays.asList(new Role("USER"), new Role("ACTUATOR")))); 
     } 
     builder.userDetailsService(userDetailsService(repository)).passwordEncoder(passwordEncoder); 
    } 
    private UserDetailsService userDetailsService(final UserRepository repository) { 
     return username -> new CustomUserDetails(repository.findByUsername(username)); 
    } 
} 

だから、私は実装されてきた方法を使用して。私は実際のユーザーを得ることができますが、エンドポイントが呼び出されるたびにデータベースクエリを意味します。ユーザーを取得し、ユーザーuuidと照合します。

私は、ユーザーを取得し、UUID = user.getUuid(あれば比較することができます別の方法)事前に

感謝を見つけたいです。

答えて

0

として、ユーザーの詳細情報を保管、私はここに残して解決策を見つけることができました。 CustomUserDetailsは質問に表示され、そこから簡単にuuidを取得して要求されたものと一致させることができます。

public static CustomUserDetails getCurrentUser() { 
    SecurityContext securityContext = SecurityContextHolder.getContext(); 
    Authentication authentication = securityContext.getAuthentication(); 
    if (authentication != null) { 
     if (authentication.getPrincipal() instanceof CustomUserDetails) { 
      return (CustomUserDetails) authentication.getPrincipal(); 
     } 
    } 
    throw new IllegalStateException("User not found!"); 
} 

EDIT:ユーザーを返すようにしたい場合は、Utilsのか何かでこの

public class CustomUserDetails implements UserDetails { 

    private Collection<? extends GrantedAuthority> authorities; 
    private String password; 
    private String username; 
    private User user; 

    public CustomUserDetails(User user) { 
     this.username = user.getUsername(); 
     this.password = user.getPassword(); 
     this.user = user; 
     this.authorities = translate(user.getRoles()); 
    } 
} 

そしてような何かを、すべての努力のため

public static User getCurrentUser() { 
     SecurityContext securityContext = SecurityContextHolder.getContext(); 
     Authentication authentication = securityContext.getAuthentication(); 
     if (authentication != null) { 
      if (authentication.getPrincipal() instanceof CustomUserDetails) { 
       CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); 
       return userDetails.getUser(); 
      } 
     } 
     throw new IllegalStateException("User not found!"); 
    } 

感謝。

0

カスタム認証プロバイダを実装し、いくつかの時間と多くのミスの後校長

Spring Security Authentication Provider

+0

私はちょうど試しましたが、私は統合に問題があります。私は今までの実装に関して読者を明確にするために投稿を更新しました。御時間ありがとうございます。 – Ricardo

関連する問題