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를 참조하십시오.