web-dev-qa-db-ja.com

キークロークでクライアントアクセスを1つのユーザーグループのみに制限するにはどうすればよいですか?

keycloakにawx(ansible Tower)Webページのクライアントがあります。このクライアントを介してログインするには、特定のkeycloakグループのユーザーのみが必要です。

他のすべてのユーザー(特定のグループを除く)がこのkeycloakクライアントを使用できないようにするにはどうすればよいですか?

9
lukasell

私はそれを次のように解決しました:

  1. Keycloakに新しいロールを作成します。
  2. この役割をグループに割り当てます。
  3. Kycloakで新しい認証スクリプトを作成します。ログイン時に許可されるロールを構成します(例:user.hasRole(realm.getRole("yourRoleName")))。
  4. クライアントの設定の[Authentication Flow Overrides]で、作成した認証スクリプトを選択します。
4
lukasell

Keycloak管理コンソールで、[クライアント]メニューに移動し、クライアントを選択します。クライアントの設定ページで、Authorization Enabled:Onを設定し、Saveをクリックします。新しいAuthorizationタブが表示されますので、そこに移動してからPoliciesタブの下で、Create Policyをクリックし、Group-based policyを選択します。そこで、あなたは 特定のグループへのアクセスを制限する を行うことができます。これは、すでに[グループ]メニューでグループを定義していることを前提としています。

--EDIT 2019-11-08--

コメントで述べたように、Client Protocolopenid-connectに設定する必要がありますおよびAccess Typeconfidentialに設定して、 Authorization Enabledオプションが表示されます。

7

役立つ場合は、次のスクリプトを使用して、この動作をクライアントに実装できます。クライアントに特定の役割(ここではfeature:authenticateと呼ばれます)が含まれている場合、スクリプトはユーザーに役割があるかどうかを確認し、エラーページ(テーマにデプロイする必要のある新しいテンプレート)でない場合。

AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");

 function authenticate(context) {
    var MANDATORY_ROLE = 'feature:authenticate';
    var username = user ? user.username : "anonymous";

    var client = session.getContext().getClient();

    LOG.debug("Checking access to authentication for client '" + client.getName() + "' through mandatory role '" + MANDATORY_ROLE + "' for user '" + username + "'");

    var mandatoryRole = client.getRole(MANDATORY_ROLE);

    if (mandatoryRole === null) {
        LOG.debug("No mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
        return context.success();
    }

    if (user.hasRole(mandatoryRole)) {
        LOG.info("Successful authentication for user '" + username + "' with mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
        return context.success();
    }

    LOG.info("Denied authentication for user '" + username + "' without mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
    return denyAccess(context, mandatoryRole);
 }

 function denyAccess(context, mandatoryRole) {
    var formBuilder = context.form();
    var client = session.getContext().getClient();
    var description = !mandatoryRole.getAttribute('deniedMessage').isEmpty() ? mandatoryRole.getAttribute('deniedMessage') : [''];
    var form = formBuilder
        .setAttribute('clientUrl', client.getRootUrl())
        .setAttribute('clientName', client.getName())
        .setAttribute('description', description[0])
        .createForm('denied-auth.ftl');
    return context.failure(AuthenticationFlowError.INVALID_USER, form);
 }
3
Allan

docu https://www.keycloak.org/docs/6.0/server_admin/#executions によると、「実行の追加」でカスタムスクリプトを追加するには、その機能をアクティブにする必要があります。

bin/standalone.sh|bat -Dkeycloak.profile.feature.scripts=enabled

機能を備えた@Allanソリューション:認証は私にはよさそうです

1
Andre Krueger

この拡張機能を使用して、特定のグループへのアクセスを制限できます: https://github.com/thomasdarimont/keycloak-extension-playground/tree/master/auth-require-group-extension

0
dmorlock