ホームページ  >  記事  >  バックエンド開発  >  Java バックエンド開発: API のマルチロール権限管理に Java Authentication and Authorization Service を使用する

Java バックエンド開発: API のマルチロール権限管理に Java Authentication and Authorization Service を使用する

WBOY
WBOYオリジナル
2023-06-17 10:27:251217ブラウズ

インターネットの発展に伴い、さまざまな Web アプリケーションや API のアプリケーション シナリオはますます広範囲になり、API のマルチロール権限管理がますます重要なトピックになっています。 Java バックエンド開発では、Java Authentication and Authorization Service (JAAS) が信頼できるソリューションであり、API インターフェイスへのアクセス権限を簡単に管理できるロールベースの権限制御メカニズムを提供します。

JAAS フレームワークは Java Authentication and Authorization Service の略で、Java SE 標準 API の 1 つで、主にアプリケーションの認証と認可に使用されます。 JAAS フレームワークの中核となる概念は構成ソースとポリシー ソースであり、これらはプログラム内のさまざまなユーザー タイプとアクセス ポリシーを識別および管理するために使用されます。

JAAS フレームワークは、Subject と LoginModule という 2 つの主要な抽象化を提供します。 Subject はプログラム内のユーザーまたはユーザー グループを表し、LoginModule は認証と認可の特定の実装です。 JAAS フレームワークは、これら 2 つの抽象化を通じて、ロールベースの権限制御メカニズムを実装します。

JAAS フレームワークを使用して API ロールの権限管理を実装する方法を見てみましょう。

  1. JAAS の構成

まず、JAAS を構成する必要があります。プロジェクト内に構成ファイル (例: jaas.conf) を作成できます。構成ファイルの内容は次のとおりです:

Sample {
    com.example.security.SimpleLoginModule required;
};

上記の構成では、Sample はプログラム名、com.example です。 security.SimpleLoginModule は LoginModule を実装します インターフェイスのクラス名。

  1. LoginModule インターフェイスの実装

次に、ユーザーを認証および承認するために LoginModule インターフェイスを実装するクラスを実装する必要があります。コード例は次のとおりです。

package com.example.security;

import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;

public class SimpleLoginModule implements LoginModule {

    private Subject subject;
    private CallbackHandler callbackHandler;
    private Map<String, ?> sharedState;
    private Map<String, ?> options;
    private String username;

    public void initialize(
        Subject subject,
        CallbackHandler callbackHandler,
        Map<String, ?> sharedState,
        Map<String, ?> options
    ) {
        this.subject = subject;
        this.callbackHandler = callbackHandler;
        this.sharedState = sharedState;
        this.options = options;
    }

    public boolean login() throws LoginException {
        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("username: ");
        callbacks[1] = new PasswordCallback("password: ", false);

        try {
            callbackHandler.handle(callbacks);

            String username = ((NameCallback) callbacks[0]).getName();
            String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());

            // 验证用户名和密码,通过返回true
            if ("admin".equals(username) && "123456".equals(password)) {
                this.username = username;
                return true;
            } else {
                throw new LoginException("Invalid username or password");
            }
        } catch (UnsupportedCallbackException | IOException e) {
            e.printStackTrace();
            throw new LoginException(e.getMessage());
        }
    }

    public boolean commit() throws LoginException {
        subject.getPrincipals().add(new SimplePrincipal(username));
        return true;
    }

    public boolean abort() throws LoginException {
        return true;
    }

    public boolean logout() throws LoginException {
        subject.getPrincipals().removeIf(principal -> principal.getName().equals(username));
        return true;
    }

}

その中で、LoginModule インターフェイスのメソッドを実装することで、ユーザーの認証と認可を実装します。ログイン メソッドでは、CallbackHandler を使用してユーザーが入力したユーザー名とパスワードを取得し、認証します。コミット メソッドでは、後続のロール承認のためにユーザー情報をサブジェクトに追加します。

  1. ロール承認の実装

次に、特定の API インターフェイスに対してロール承認を実行する必要があります。認可には Java EE によって提供されるアノテーションを使用できます (例:

@RolesAllowed({"admin","user"})
@Path("/api/hello")
public class HelloResource {

    @GET
    public Response greet() {
        return Response.ok("Hello World!").build();
    }

}

上の例では、@RolesAllowed アノテーションを使用して API のアクセス ロールを指定します。管理者ロールとユーザー ロールを持つユーザーのみ) API インターフェイスにアクセスできます。

  1. アプリケーション サーバーの構成

最後に、アプリケーション サーバーに JAAS サポートを追加するには、server.xml に次の構成を追加します:

<server>
  ...
  <featureManager>
    ...
    <feature>appSecurity-2.0</feature>
  </featureManager>
  ...
</server>

web.xml に次のコードを追加します。

<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>sampleRealm</realm-name>
  <form-login-config>
    <form-login-page>/login.html</form-login-page>
    <form-error-page>/error.html</form-error-page>
  </form-login-config>
</login-config>

<security-constraint>
  <web-resource-collection>
    <web-resource-name>helloResource</web-resource-name>
    <url-pattern>/api/hello</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admin</role-name>
    <role-name>user</role-name>
</auth-constraint>

上記の構成では、FORM 認証方法の使用を指定し、ページに対応するページを提供しました。同時に、/hello API の役割を承認するためのセキュリティ制約も指定する必要があります。

これまでに、API マルチロール権限管理の構成が完了しました。

概要

JAAS フレームワークとは、Java Authentication and Authorization Service の略称で、Java SE 標準 API の 1 つで、主にアプリケーションの認証と認可に使用されます。 Java バックエンド開発では、API マルチロール権限管理用の JAAS フレームワークを使用すると、ロール承認を簡単に実装できます。構成およびポリシー ソースを通じてロールベースの権限制御メカニズムを実装し、ID の認証と認可に LoginModule インターフェイスを使用し、API ロールの認可にアノテーションを使用しました。アプリケーションサーバーを構成することで、最終的に API マルチロール権限管理を実装しました。

以上がJava バックエンド開発: API のマルチロール権限管理に Java Authentication and Authorization Service を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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