5.3. JavaScript 기반 정책


주의

정책 구현에서 아래 예제와 같이 특성 기반 액세스 제어(ABAC)를 사용하는 경우 사용자가 보호되는 특성을 편집할 수 없고 해당 속성이 읽기 전용입니다. 위협 모델 완화 장에서 자세한 내용을 참조하십시오.

이 유형의 정책을 사용하여 JavaScript를 사용하여 권한에 대한 조건을 정의할 수 있습니다. Red Hat Single Sign-On에서 지원하는 규칙 기반 정책 유형 중 하나로, appvail API를 기반으로 모든 정책을 작성할 수 있는 유연성을 제공합니다.

새로운 JavaScript 기반 정책을 만들려면 정책 목록의 오른쪽 상단에 있는 항목 목록에서 JavaScript 를 선택합니다.

참고

기본적으로 JavaScript 정책을 서버에 업로드할 수 없습니다. JavaScript Provider 에 설명된 대로 JS 정책을 서버에 직접 배포하는 것을 선호해야 합니다.

5.3.1. 배포된 JAR 파일에서 JS 정책 생성

Red Hat Single Sign-On을 사용하면 서버에 스크립트를 배포하기 위해 JAR 파일을 배포할 수 있습니다. 자세한 내용은 JavaScript Provider를 참조하십시오.

스크립트가 배포되면 사용 가능한 정책 공급자 목록에서 배포한 스크립트를 선택할 수 있어야 합니다.

5.3.2. 예

5.3.2.1. 평가 컨텍스트에서 속성 확인

다음은 특성 기반 액세스 제어(ABAC)를 사용하여 실행 컨텍스트에서 얻은 특성을 기반으로 조건을 정의하는 JavaScript 기반 정책의 간단한 예입니다.

const context = $evaluation.getContext();
const contextAttributes = context.getAttributes();

if (contextAttributes.containsValue('kc.client.network.ip_address', '127.0.0.1')) {
    $evaluation.grant();
}

5.3.2.2. 현재 ID에서 속성 확인

다음은 특성 기반 액세스 제어(ABAC)를 사용하여 현재 ID와 연결된 특성을 기반으로 조건을 정의하는 JavaScript 기반 정책의 간단한 예입니다.

const context = $evaluation.getContext();
const identity = context.getIdentity();
const attributes = identity.getAttributes();
const email = attributes.getValue('email').asString(0);

if (email.endsWith('@keycloak.org')) {
    $evaluation.grant();
}

권한 부여 요청에 사용된 토큰에 정의된 모든 클레임에서 이러한 특성이 매핑되는 위치입니다.

5.3.2.3. 현재 ID에 부여된 역할 확인

정책에서 RBAC(역할 기반 액세스 제어)를 사용할 수도 있습니다. 아래 예제에서는 사용자에게 keycloak_user 영역 역할이 부여되었는지 확인합니다.

const context = $evaluation.getContext();
const identity = context.getIdentity();

if (identity.hasRealmRole('keycloak_user')) {
    $evaluation.grant();
}

또는 my- client -role 클라이언트 역할이 사용자에게 부여되었는지 확인할 수 있습니다. 여기서 my-client 는 클라이언트 애플리케이션의 클라이언트 ID입니다.

const context = $evaluation.getContext();
const identity = context.getIdentity();

if (identity.hasClientRole('my-client', 'my-client-role')) {
    $evaluation.grant();
}

5.3.2.4. 사용자에게 부여된 역할 확인

사용자에게 부여된 영역 역할을 확인하려면 다음을 수행하십시오.

const realm = $evaluation.getRealm();

if (realm.isUserInRealmRole('marta', 'role-a')) {
    $evaluation.grant();
}

사용자에게 부여된 클라이언트 역할의 경우:

const realm = $evaluation.getRealm();

if (realm.isUserInClientRole('marta', 'my-client', 'some-client-role')) {
    $evaluation.grant();
}

5.3.2.5. 그룹에 부여된 역할 확인

그룹에 부여된 영역 역할을 확인하려면 다음을 수행하십시오.

const realm = $evaluation.getRealm();

if (realm.isGroupInRole('/Group A/Group D', 'role-a')) {
    $evaluation.grant();
}

5.3.2.6. 리소스 서버에 임의의 클레임 푸시

권한을 적용하는 방법에 대한 추가 정보를 제공하기 위해 리소스 서버에 임의의 클레임을 푸시하려면 다음을 수행합니다.

const permission = $evaluation.getPermission();

// decide if permission should be granted

if (granted) {
    permission.addClaim('claim-a', 'claim-a');
    permission.addClaim('claim-a', 'claim-a1');
    permission.addClaim('claim-b', 'claim-b');
}

5.3.2.7. 그룹 멤버십 확인

const realm = $evaluation.getRealm();

if (realm.isUserInGroup('marta', '/Group A/Group B')) {
    $evaluation.grant();
}

5.3.2.8. 다른 액세스 제어 메커니즘 혼합

여러 액세스 제어 메커니즘의 조합을 사용할 수도 있습니다. 아래 예제에서는 역할(RBAC) 및 클레임/attribute(ABAC) 검사를 동일한 정책 내에서 사용하는 방법을 보여줍니다. 이 경우 사용자가 admin 역할로 부여되었는지 또는 keycloak.org 도메인의 이메일이 있는지 확인합니다.

const context = $evaluation.getContext();
const identity = context.getIdentity();
const attributes = identity.getAttributes();
const email = attributes.getValue('email').asString(0);

if (identity.hasRealmRole('admin') || email.endsWith('@keycloak.org')) {
    $evaluation.grant();
}
참고

자체 규칙을 작성할 때 $evaluation 오브젝트는 org.keycloak.authorization.policy.evaluation.Evaluation 을 구현하는 오브젝트임을 유의하십시오. 이 인터페이스에서 액세스할 수 있는 항목에 대한 자세한 내용은 API를 참조하십시오.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.