ホームページ  >  記事  >  Java  >  Java API開発における安全な認可のためのSpring Security OAuthの使用

Java API開発における安全な認可のためのSpring Security OAuthの使用

WBOY
WBOYオリジナル
2023-06-18 08:01:271729ブラウズ

Java API 開発における一般的な要件は、ユーザーの認証および認可機能を実装することです。より安全で信頼性の高いAPIサービスを提供するためには、特に認可機能が重要になっています。 Spring Security OAuth は、Java API での認可機能の実装に役立つ優れたオープンソース フレームワークです。この記事では、Spring Security OAuth を使用して安全な認証を行う方法を紹介します。

  1. Spring Security OAuth とは何ですか?

Spring Security OAuth は Spring Security フレームワークの拡張機能であり、OAuth 認証および認可機能の実装に役立ちます。

OAuth は、サードパーティ アプリケーションがリソースにアクセスすることを承認するためのオープン スタンダードです。これは、ビジネス ロジックの分離とアプリケーションの安全性を実現するのに役立ちます。 OAuth 承認プロセスには通常、次の役割が含まれます:

  • ユーザー: リソースの所有者;
  • クライアント: ユーザー リソースへのアクセスに適用されるアプリケーション;
  • 認可サーバー: ユーザーの認可を処理するサーバー;
  • リソースサーバー: ユーザーのリソースを格納するサーバー;
  1. 認可プロセス

Spring Security OAuth OAuth を実装します 認可プロセスの 4 つのエンドポイント:

  • /oauth/authorize: 認可サーバーの認可エンドポイント;
  • /oauth/token: 認可サーバーのトークン エンドポイント;
  • /oauth/confirm_access: クライアントが承認を確認するためのエンドポイント;
  • /oauth/error: 承認サーバーのエラー メッセージのエンドポイント;

Spring Security OAuth は、OAuth 2.0 の 4 つの側面を実装します 大規模認可モード:

  • 認可コード モード: 使用シナリオは、アプリケーションの起動時にユーザー認可が必要であることです;
  • パスワード モード: 使用シナリオは、クライアントがユーザー資格情報を独立して管理することです。
  • 簡易モード: 使用シナリオは、クライアントがブラウザーで実行され、クライアントはユーザー資格情報を保護する必要がありません。
  • クライアント モード: 使用シナリオでは、クライアントはユーザー認証を必要とせず、要求されたアクセス トークンはクライアント自体のみを表します;
    #Spring Security OAuth 依存関係を追加します
Spring Security OAuth 依存関係をプロジェクトに追加します。 pom.xml で以下を構成します。

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

    認可サーバーの構成
認可のために認可サーバーを定義する必要があります。 Spring Security OAuth では、OAuth2 認証サーバーを有効にし、AuthorizationServerConfigurer インターフェイスを実装することで、認可サーバーを定義できます。

@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 を定義します。

    リソース サーバーの構成
Spring Security OAuth セキュリティ認証を使用するには、リソース サーバーも構成する必要があります。 Spring Security OAuth では、ResourceServerConfigurer インターフェイスを実装することでリソース サーバーを定義できます。

@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」も構成します。

    Web セキュリティの構成
Spring Security OAuth セキュリティ認証を使用するには、Web セキュリティも構成する必要があります。 Spring Security OAuth では、SecurityConfigurer インターフェースを実装することでセキュリティを定義できます。

@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/** に続くすべてのパスは認証を必要とし、その他のパスは匿名でアクセスできます) 。また、ユーザーがアプリケーションにログインできるように、簡単なフォーム ログインも構成しました。

    UserDetailsS​​ervice の実装
セキュリティ認証で使用するために、UserDetailsS​​ervice インターフェイスを実装する必要があります。ここでは、メモリを直接使用してユーザー アカウントとパスワードを保存し、データベース操作は関与しません。

@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");
        }
    }
}

    API の実装
次に、単純な API を実装する必要があります。クライアントに挨拶を返すための getGreeting() API を /api/** パスの下に追加しました。

@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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。