私は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(あれば比較することができます別の方法)事前に
感謝を見つけたいです。
私はちょうど試しましたが、私は統合に問題があります。私は今までの実装に関して読者を明確にするために投稿を更新しました。御時間ありがとうございます。 – Ricardo