이 페이지는 Login Rules를 구동하는 표현 언어에 대한 세부 정보를 제공합니다.
클러스터에 첫 번째 Login Rule을 추가하는 방법을 알아보려면
Login Rules 가이드를 참조하십시오.
YAML 명세#
kind: login_rule
version: v1
metadata:
name: example
spec:
priority: 0
traits_map:
groups:
- external.groups
logins:
- strings.lower(external.username)
traits_expression: |
external.put("logins", strings.lower(external.logins))
traits_map vs traits_expression#
모든 Login Rule 명세는 traits_map 필드 또는 traits_expression 필드 중 하나를 포함해야 합니다.
두 필드 모두 사용자 traits를 변환하는 동일한 목적을 수행합니다.
논리적 차이는 사용 사례에 맞는 구문에만 있으며, 모든 traits_map을 동등한 traits_expression으로 작성할 수 있습니다.
traits_map은 특별히 포함되지 않은 traits를 제거하는 반면,
traits_expression 구문은 나머지를 변경하지 않고 특정 traits만 추가하거나 수정할 수 있습니다.
traits_map 동작은 다른 traits를 모두 필터링하면서 소수의 필요한 traits만 유지하려는 경우 유용합니다.
우선순위가 낮은 Login Rules에서 traits를 설정하는 경우, 해당 traits는 계속 설정되려면 우선순위가 높은 traits_map에도 포함되어야 합니다. 예를 들어 다음 구성은 groups trait을 수정하지 않고 유지합니다.
traits_map:
groups:
- external["groups"]
traits_map#
다음은 traits_map을 사용하여 아래 규칙을 구현하는 Login Rule 예시입니다:
groups: devs trait을 가진 모든 사용자는 추가 trait access: [staging]을 받아야 합니다.
groups: admins trait을 가진 모든 사용자는 추가 trait access: [staging, prod]을 받아야 합니다.
- 모든 사용자는 소문자로 변환된 수신
username trait 값을 가진 logins trait을 받아야 합니다.
groups, logins, access 이외의 모든 traits는 필터링되어야 합니다.
kind: login_rule
version: v1
metadata:
name: my_expression_rule
spec:
priority: 0
traits_map:
groups:
- external["groups"]
logins:
- 'strings.lower(external.username)'
access:
- 'ifelse(external.groups.contains("devs"), set("staging"), set())'
- 'ifelse(external.groups.contains("admins"), set("staging", "prod"), set())'
traits_expression#
다음은 위 예시와 동일한 규칙을 구현하는 traits_expression 필드를 사용하는 Login Rule 예시입니다:
kind: login_rule
version: v1
metadata:
name: my_expression_rule
spec:
priority: 0
traits_expression: |
dict(
pair("groups", external.groups),
pair("logins", strings.lower(external.username)),
pair("access",
choose(
option(external.groups.contains("devs"), set("staging")),
option(external.groups.contains("admins"), set("staging", "prod")),
option(true, set()),
),
),
)
모든 traits 표현식은 완전한 출력 traits 집합으로 사용될 dict 유형의 값을 반환해야 합니다.
위에 표시된 것처럼 처음부터 dict를 구성하거나, 다음과 같이 external dict에 저장된 수신 traits를 수정할 수 있습니다:
kind: login_rule
version: v1
metadata:
name: uppercase_logins
spec:
priority: 0
traits_expression: |
external.put("logins", strings.lower(external.logins))
dict 유형#
dict는 string 키에서 set 값으로 매핑하는 딕셔너리 유형입니다.
Login Rule 표현식이 external.<trait> 또는 external[<trait>] 구문으로 입력 traits에 접근할 때, external은 dict 유형의 값입니다.
dict 유형의 값은 표현식 내에서 구성하고 접근할 수 있습니다.
traits_expression 필드에 사용되는 표현식은 반드시 dict 유형의 값을 반환해야 합니다.
생성자#
시그니처#
func dict(pairs ...pair) dict
dict 생성자는 pairs 인수의 초기 키-값 쌍으로 채워진 새 dict를 반환합니다.
각 pair는 string과 set를 보유해야 합니다.
| 인수 |
유형 |
설명 |
pairs |
...pair |
dict를 초기화할 0개 이상의 키-값 쌍. |
반환값#
| 표현식 |
결과 |
dict() |
{} |
dict(pair("a", set("x", "y"))) |
{"a": ("x", "y")} |
접근자#
| 구문 |
예시 |
설명 |
dict.key |
external.username |
"점" 접근자는 주어진 키에 대한 set을 반환하거나, 해당 키에 값이 없으면 빈 set을 반환합니다. |
dict["key"] |
external["user-name"] |
대괄호 접근자는 "점" 접근자와 동일하게 동작하지만, 파싱을 위해 반드시 인용해야 하는 특수 문자(-, ., 등 포함)를 포함하는 키를 지원합니다. |
dict.add_values#
시그니처#
func (dict) add_values(key string, values ...string) dict
dict.add_values는 주어진 값이 dict[key]의 set에 추가된 dict의 복사본을 반환합니다.
dict[key]에 이미 존재하는 set이 없으면 새로운 set이 생성됩니다.
| 인수 |
유형 |
설명 |
key |
string |
새 값이 추가되어야 할 키. |
values |
...string |
dict[key]에 추가할 하나 이상의 문자열 값. |
반환값#
| 유형 |
설명 |
dict |
키 key에 values가 추가된 주어진 dict의 복사본. |
| 표현식 |
결과 |
dict().add_values("logins", "ubuntu", "ec2-user") |
{"logins": ("ubuntu", "ec2-user")} |
dict(pair("a", set("x"))).add_values("a", "y", "z") |
{"a": ("x", "y", "z")} |
dict.remove#
시그니처#
func (dict) remove(keys ...string) dict
dict.remove는 주어진 키가 제거된 dict의 복사본을 반환합니다.
dict에 없는 키는 영향을 주지 않습니다.
| 인수 |
유형 |
설명 |
keys |
...string |
dict에서 제거할 하나 이상의 키. |
반환값#
| 유형 |
설명 |
dict |
주어진 키가 제거된 dict의 복사본. |
| 표현식 |
결과 |
dict(pair("a", set("x"))).remove("a", "b") |
{} |
dict(pair("a", set("x")), pair("b", set("c"))).remove("b") |
{"a": ("x")} |
dict.put#
시그니처#
func (dict) put(key string, value set) dict
dict.put은 dict[key]가 value로 설정된 dict의 복사본을 반환합니다.
주어진 키에 이미 값이 있으면 덮어씁니다.
| 인수 |
유형 |
설명 |
key |
string |
새 값을 설정할 키 |
value |
set |
주어진 키에 설정할 문자열 집합 |
반환값#
| 유형 |
설명 |
dict |
dict[key]가 value로 설정된 주어진 dict의 복사본. |
| 표현식 |
결과 |
dict(pair("a", set("x"))).put("a", set("y")) |
{"a": ("y")} |
dict().put("b", set("z")) |
{"b": ("z")} |
set 유형#
set은 고유한 문자열의 집합을 보유합니다.
생성자#
시그니처#
func set(values ...string) set
set 생성자는 주어진 values로 초기화된 새 set을 반환합니다.
| 인수 |
유형 |
설명 |
values |
...string |
set을 초기화할 0개 이상의 문자열. |
반환값#
| 유형 |
설명 |
set |
주어진 값으로 초기화된 새 set. |
| 표현식 |
결과 |
set() |
() |
set("a", "b", "a") |
("a", "b") |
set.contains#
시그니처#
func (set) contains(value) bool
set.contains는 set이 value와 정확히 일치하는 항목을 포함하면 true를 반환하고,
그렇지 않으면 false를 반환합니다.
| 인수 |
유형 |
설명 |
value |
string |
set에서 확인할 문자열. |
반환값#
| 유형 |
설명 |
bool |
set이 value와 정확히 일치하는 항목을 포함하면 true, 그렇지 않으면 false. |
| 표현식 |
결과 |
set("a", "b").contains("a") |
true |
set("a", "b").contains("x") |
false |
set.add#
시그니처#
func (set) add(values ...string) set
set.add는 새 values가 추가된 주어진 set의 복사본인 새 set을 반환합니다.
| 인수 |
유형 |
설명 |
values |
...string |
set에 추가할 값. |
반환값#
| 유형 |
설명 |
set |
values가 추가된 주어진 set의 복사본인 새 set. |
| 표현식 |
결과 |
set("a", "b").add("b", "c") |
("a", "b", "c") |
set.remove#
시그니처#
func (set) remove(values ...string) set
set.remove는 모든 values가 제거된 주어진 set의 복사본인 새 set을 반환합니다.
| 인수 |
유형 |
설명 |
values |
...string |
set에서 제거할 값. |
반환값#
| 유형 |
설명 |
set |
values가 제거된 주어진 set의 복사본인 새 set. |
| 표현식 |
결과 |
set("a", "b").remove("b", "c") |
("a") |
pair 유형#
pair는 임의의 유형의 두 값을 보유할 수 있습니다.
현재 유일한 용도는 dict 생성자에서 string과 set 유형의 키-값 쌍을 보유하는 것입니다.
생성자#
시그니처#
func pair(first, second any) pair
pair 생성자는 first와 second를 보유하는 새 pair를 반환합니다.
| 인수 |
유형 |
설명 |
first |
any |
임의의 유형의 값. |
second |
any |
임의의 유형의 값. |
반환값#
| 유형 |
설명 |
pair |
first와 second를 보유하는 새 pair. |
| 표현식 |
결과 |
pair("logins", set("root", "user")) |
{"logins", ("root", "user")} |
option 유형#
option은 choose의 인수로만 사용됩니다.
option이 선택될 수 있는 Boolean 조건과 해당 option이 실제로 선택된 경우 choose 표현식이 반환해야 하는 값을 보유합니다.
생성자#
시그니처#
func option(cond bool, value any) option
cond와 value를 보유하는 새 option을 반환합니다.
| 인수 |
유형 |
설명 |
cond |
bool |
이 option이 선택될 수 있는 Boolean 조건. |
value |
any |
이 option이 선택된 경우 choose가 반환해야 하는 값. |
반환값#
| 유형 |
설명 |
option |
choose의 인수로 전달되어야 하는 option 유형. |
choose의 예시를 참조하십시오.
헬퍼 함수#
strings.upper#
시그니처#
func strings.upper(input set) set
strings.upper는 주어진 문자열 집합을 대문자로 변환한 복사본을 반환합니다.
| 인수 |
유형 |
설명 |
input |
set |
대문자로 변환할 입력 문자열의 집합 |
반환값#
| 유형 |
설명 |
set |
각 문자열이 대문자로 변환된 input의 복사본 |
| 표현식 |
결과 |
strings.upper(set("Alice")) |
("ALICE") |
strings.upper(set("AbCdE", "fGhIj)) |
("ABCDE", "FGHIJ") |
strings.lower#
시그니처#
func strings.lower(input set) set
strings.lower는 주어진 문자열 집합을 소문자로 변환한 복사본을 반환합니다.
| 인수 |
유형 |
설명 |
input |
set |
소문자로 변환할 입력 문자열의 집합 |
반환값#
| 유형 |
설명 |
set |
각 문자열이 소문자로 변환된 input의 복사본 |
| 표현식 |
결과 |
strings.lower(set("Alice")) |
("alice") |
strings.lower(set("AbCdE", "fGhIj)) |
("abcde", "fghij") |
strings.replaceall#
시그니처#
func strings.replaceall(input set, match string, replacement string) set
strings.replaceall은 문자열 집합에 대한 부분 문자열 교체를 구현합니다.
반환값은 input의 각 요소에서 발견된 match의 각 부분 문자열 일치가 replacement로 교체된 input의 복사본입니다.
일치는 리터럴이며 정규 표현식을 지원하지 않습니다.
| 인수 |
유형 |
설명 |
input |
set |
교체가 필요한 입력 문자열의 집합 |
match |
string |
교체될 리터럴 부분 문자열 |
replacement |
string |
match의 모든 인스턴스를 교체할 리터럴 문자열 |
반환값#
| 유형 |
설명 |
set |
input의 각 요소에서 발견된 match의 각 인스턴스가 replacement로 교체된 input의 복사본. |
| 표현식 |
결과 |
strings.replaceall(set("user-name"), "-", "_") |
("user_name") |
strings.replaceall(set("user-alice", "user-bob"), "user-", "") |
("alice", "bob") |
strings.split#
시그니처#
func strings.split(input set, separator string) set
strings.split은 input의 각 요소를 separator의 각 일치에서 분할하고
모든 분할된 문자열의 합집합을 포함하는 set을 반환합니다.
이는 IdP가 다중 값 클레임을 전달할 수 없을 때 유용할 수 있으며, 이 헬퍼 함수를 사용하는 Login Rule은 단일 클레임 값을 여러 값을 가진 Teleport trait으로 분할할 수 있습니다.
| 인수 |
유형 |
설명 |
input |
set |
분할해야 할 입력 문자열의 집합 |
sep |
string |
리터럴 문자열 구분자 |
반환값#
| 유형 |
설명 |
set |
모든 분할된 문자열의 합집합 |
| 표현식 |
결과 |
strings.split(set("alice,bob,charlie"), ",") |
("alice", "bob", "charlie") |
strings.split(set("devs security"), " ") |
("devs", "security") |
email.local#
시그니처#
func email.local(input set) set
email.local은 입력 set의 각 이메일을 로컬 부분으로 매핑합니다.
| 인수 |
유형 |
설명 |
input |
set |
입력 이메일의 집합 |
반환값#
| 유형 |
설명 |
set |
각 이메일이 로컬 부분으로 변환된 input의 복사본. |
| 표현식 |
결과 |
email.local(set("alice@example.com")) |
("alice") |
email.local(set("Alice <alice@example.com>")) |
("alice") |
regexp.replace#
시그니처#
func regexp.replace(input set, expression string, replacement string) set
regexp.replace는 input의 각 요소에서 expression의 모든 일치를 찾아
replacement로 교체합니다.
표현식과 일치하지 않는 값은 필터링됩니다.
교체는 expression의 캡처 그룹 확장을 지원합니다.
$N은 N번째 캡처 그룹을 참조하는 데 사용되며, $1부터 시작합니다.
| 인수 |
유형 |
설명 |
input |
set |
입력 문자열의 집합 |
반환값#
| 유형 |
설명 |
set |
각 문자열에서 expression의 모든 일치가 replacement로 교체된 input의 복사본. |
| 표현식 |
결과 |
regexp.replace(set("team-devs"), "^team-(.*)$", "$1") |
("devs") |
regexp.replace(set("team-dev-security"), "^team-(.*)-(.*)$", "$1.$2") |
("dev.security") |
ifelse#
시그니처#
func ifelse(cond bool, valueIfTrue any, valueIfFalse any) any
ifelse는 순수 함수형 스타일로 고전적인 if-else 분기를 구현합니다.
첫 번째 인수가 true로 평가되면 두 번째 인수가 반환되고, 그렇지 않으면 세 번째 인수가 반환됩니다.
| 인수 |
유형 |
설명 |
cond |
bool |
이어지는 두 인수 중 어느 것이 반환될지를 결정하는 Boolean 조건. |
valueIfTrue |
any |
cond가 true이면 반환할 임의 유형의 값. |
valueIfFalse |
any |
cond가 false이면 반환할 임의 유형의 값. |
반환값#
| 유형 |
설명 |
any |
두 번째 또는 세 번째 인수가 반환됩니다. |
| 표현식 |
결과 |
ifelse(set("a", "b").contains("a"), set("x", "y"), set("z")) |
("x", "y") |
ifelse(set("a", "b").contains("c"), set("x", "y"), set("z")) |
("z") |
choose#
시그니처#
func choose(options ...option) any
choose는 switch 문의 함수형 스타일을 구현하여, 조건이 true로 평가되는 첫 번째
option 인수를 반환합니다.
런타임에 option을 선택할 수 없으면 오류를 반환하고 로그인이 성공하지 못합니다.
이 시나리오를 피하기 위해 기본 option을 구현하는 조건이 true로 하드코딩된 마지막 option을 추가하는 것을 권장합니다.
예를 들어 choose(..., option(true, set()))는 다른 option을 선택할 수 없는 경우 빈 set을 반환합니다.
| 인수 |
유형 |
설명 |
options |
...option |
하나 이상의 option. |
반환값#
| 유형 |
설명 |
any |
조건이 true로 평가되는 첫 번째 option 인수의 값으로, 임의의 유형일 수 있습니다. |
| 표현식 |
결과 |
choose(option(false, set("x")), option(true, set("y")), option(true, set("z"))) |
("y") |
choose(option(set("a", "b").contains("a"), set("x")), option(true, set("y"))) |
("x") |
union#
시그니처#
func union(sets ...set) set
union은 주어진 set의 모든 요소의 합집합을 포함하는 새 set을 반환합니다.
| 인수 |
유형 |
설명 |
sets |
...set |
합집합을 구할 0개 이상의 set. |
반환값#
| 유형 |
설명 |
set |
주어진 모든 set의 합집합을 포함하는 새 set. |
| 표현식 |
결과 |
union(set("a"), set("b")) |
("a", "b") |
union(set("a", "b"), set("b", "c")) |
("a", "b", "c") |
jsonpath#
시그니처#
func jsonpath(path string) set
jsonpath는 주어진 jsonpath 쿼리를 사용하여 사용자의 원본 IdP 클레임에서 보간된 새 set을 반환합니다.
이는 일부 사용자 정의 OIDC 솔루션에서 사용되는 전통적으로 매핑되지 않은 임의 JSON 클레임과 함께 사용하기 위한 것입니다.
자세한 내용은 이 가이드를 참조하십시오.
| 인수 |
유형 |
설명 |
path |
string |
jsonpath 쿼리. |
반환값#
| 유형 |
설명 |
set |
보간된 값을 포함하는 새 set. |
아래 예시는 주어진 IdP 클레임 객체에서 동작합니다.
{
"a": ["1", "2", "3"],
"b": {
"c": "d"
}
}
| 표현식 |
결과 |
jsonpath("$.a") |
("1", "2", "3") |
jsonpath("$.b.*") |
("d") |
jsonpath("$.*.*") |
("1", "2", "3", "d") |