Java API 開発における一般的な要件は、ユーザーの認証および認可機能を実装することです。より安全で信頼性の高いAPIサービスを提供するためには、特に認可機能が重要になっています。 Spring Security OAuth は、Java API での認可機能の実装に役立つ優れたオープンソース フレームワークです。この記事では、Spring Security OAuth を使用して安全な認証を行う方法を紹介します。
Spring Security OAuth は Spring Security フレームワークの拡張機能であり、OAuth 認証および認可機能の実装に役立ちます。
OAuth は、サードパーティ アプリケーションがリソースにアクセスすることを承認するためのオープン スタンダードです。これは、ビジネス ロジックの分離とアプリケーションの安全性を実現するのに役立ちます。 OAuth 承認プロセスには通常、次の役割が含まれます:
Spring Security OAuth OAuth を実装します 認可プロセスの 4 つのエンドポイント:
Spring Security OAuth は、OAuth 2.0 の 4 つの側面を実装します 大規模認可モード:
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.3.4.RELEASE</version> </dependency>
@Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired TokenStore tokenStore; @Autowired AuthenticationManager authenticationManager; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("client") .secret("{noop}secret") .authorizedGrantTypes("client_credentials", "password") .scopes("read", "write") .accessTokenValiditySeconds(3600) .refreshTokenValiditySeconds(7200); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.tokenStore(tokenStore) .authenticationManager(authenticationManager); } }上記のコードでは、メモリベースのクライアント詳細サービスを定義し、認証タイプを client_credentials とパスワードとして構成し、アクセス トークンの有効期間とリフレッシュ トークンの有効期間も指定します。さらに、エンドポイントと、それに必要な tokenStore および authenticationManager を定義します。
@Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").authenticated() .anyRequest().permitAll(); } @Override public void configure(ResourceServerSecurityConfigurer config) throws Exception { config.resourceId("my_resource_id"); } }上記のコードでは、認証を与えるために /api/** を定義し、他のリクエストは匿名アクセスを許可します。また、後続の認可プロセスで使用するリソース ID「my_resource_id」も構成します。
@Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user") .password("{noop}password") .roles("USER"); } @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth/**") .permitAll() .anyRequest() .authenticated() .and() .formLogin() .permitAll(); } }上記のコードでは、メモリベースのユーザー詳細サービスを定義し、認証を必要とするリクエストを宣言します (つまり、/oauth/** に続くすべてのパスは認証を必要とし、その他のパスは匿名でアクセスできます) 。また、ユーザーがアプリケーションにログインできるように、簡単なフォーム ログインも構成しました。
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if ("user".equals(username)) { return new User("user", "{noop}password", AuthorityUtils.createAuthorityList("ROLE_USER")); } else { throw new UsernameNotFoundException("username not found"); } } }
@RestController @RequestMapping("/api") public class ApiController { @GetMapping("/greeting") public String getGreeting() { return "Hello, World!"; } }
http://localhost:8080/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://localhost:8080&scope=readブラウザで上記の URL にアクセスすると、認証のためのユーザー名とパスワードの入力を求められます。ユーザー名userとパスワードpasswordを入力して「認証」をクリックすると、http://localhost:8080/?code=xxxにリダイレクトされます。xxxは認証コードです。 次に、パスワード パターンを使用してアクセス トークンを取得します:
curl -X POST http://localhost:8080/oauth/token -H 'content-type: application/x-www-form-urlencoded' -d 'grant_type=password&username=user&password=password&client_id=client&client_secret=secret'アクセス トークンとリフレッシュ トークンを含む JSON 応答を受け取ります:
{ "access_token":"...", "token_type":"bearer", "refresh_token":"...", "expires_in":3600, "scope":"read" }これで、次のことが可能になります。このアクセス トークンを使用して API サービスにアクセスします:
curl -X GET http://localhost:8080/api/greeting -H 'authorization: Bearer xxx'ここで、xxx はアクセス トークンです。 「Hello, World!」という挨拶を含む JSON 応答を受け取ります。
この記事では、Spring Security OAuth を使用して安全な認証を行う方法を紹介します。 Spring Security OAuth は、OAuth 認証プロセスにおけるすべてのロールの実装に役立つ非常に強力なフレームワークです。実際のアプリケーションでは、さまざまなセキュリティ要件に応じて、さまざまな認証モードとサービス構成を選択できます。
以上がJava API開発における安全な認可のためのSpring Security OAuthの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。