# Настройка User federation

Для нашего курса был подготовлен контроллер домена Active Directory, в котором созданы пользователи вида sXXX-[1-10].
Так же там есть группа sXXX-keycloak, в которой состоят пользователи sXXX-[6-10].
Соответственно пользователи sXXX-[1-5] в этой группе не состоят.

### Давайте настроим федерацию пользователей из этого ad в keycloak.
Переходим в раздел User Federation в рилме test и выбираем add provider -> ldap
Заполняем настройки как показано на скришоте ниже:
![Alt text](img/user-federation.png?raw=true "User Federation")

sXXX заменяем на номер студента, а в Bind Credentials вводим пароль из личного кабинета.

Если не хотите, чтобы кейклок импортировал пользователей, которые отключены в AD (disabled), то можно добавить вот такой Custom User LDAP Filter:
```
(!(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)))
```
Нажимает Test authentication и получаем «Success! LDAP authentication successful.»

Затем переходим во вкладку Sync Settings и включаем Periodic Full Sync и Periodic Changed Users Sync.
Нажимаем Save, а затем Synchronize all users
Получаем примерно такое сообщение:
Success! Sync of users finished successfully. 30 imported users, 0 updated users

В ou=keycloak,dc=slurm,dc=local сейчас создаются пользователи всех студентов.
Давайте добавим только своих пользователей.
Для этого применим вот такой LDAP фильтр:

```
(&(objectCategory=person)(objectClass=user)(cn=sXXX*))
```
sXXX, как обычно, нужно заменить на номер студента.

Нажимаем Save, затем Remove imported, затем Synchronize all users.
Получаем вот такое сообщение:
"Success! Sync of users finished successfully. 10 imported users, 0 updated users"

Теперь зайдем во раздел Users.
Если нажать view all users, мы увидим как старых пользователей, которых мы ранее создали в кейклок, так и новых, импортированных из AD.

При этом если зайти в пользователя user и перейти во вкладку Attributes, то мы увидим, что там ничего нет.
Если же зайти в пользователя импортированного из AD, то во вкладке Attributes будет несколько атрибутов пользователя, которые есть в AD.

# Настройка Mappers
То, какие атрибуты пользователя импортируются в keycloak из AD настраивается с помощью mappers.
Вернёмся в раздел User federations и перейдем в настройки федерации, которую мы создали ранее. Затем перейдем во вкладку Mappers. Там мы увидим вот такую картину:
![Alt text](img/default-mappers.png?raw=true "Defaults mappers")

Это список мапперов, которые создаются по-умолчанию.
Давайте создадим еще два маппера: один для групп, второй для аттрибута SamAccountName

### Настройка маппера для групп
Во вкладке mappers в настройках user federations нажимаем Create
Вот пример настроек:
![Alt text](img/groups-mapper.png?raw=true "Group Mappers")

Мы используем LDAP фильтр, чтобы импортировать только свои группы:
```
(&(objectClass=group)(CN=s011541*))
```
Наижимаем save и Sync LDAP Groups to Keycloak
Получаем вот такое сообщение:
"Success! Data synced successfully. 1 imported groups, 0 updated groups, 0 removed groups"

Переходим в раздел Groups, нажимаем All Groups и видим нашу группу. Если зайти в её настройке, то во вкладке Members мы увидим какие пользователи состоят в этой группе.

### Настройка маппера атрибута SamAccountName
Во вкладке mappers в настройках user federations нажимаем Create
Вот пример настроек:
![Alt text](img/samaccountname.png?raw=true "sAMAcountName")
После этого нажимаем save и переходим в настройки user federations.
Нажимаем Synchronize changed users, чтобы кейклок подтянул новые атрибуты пользователей.
Теперь можно зайти в раздел Users и в настройках любого пользователи sXXX в разделе Attributes появится новый атрибут SamAccountName.

## Настройка Mappers для клиентов
Мапперы, которые мы делали ранее это мапперы федерации пользователей. Они позволяют импортировать в кейклок атрибуты пользователей. По-умолчанию эти атрибуты не добавляются в токены и никак не используются.
Для этого нужно добавить мапперы в настройках клиента.

Перейдем в раздел mappers в настройках клиента nginx и добавим маппер для групп:
![Alt text](img/groups-mapper-client.png?raw=true "Group mappers for client")

### Проверим, что маппер работает
В настройках клиента nginx зайдем во вкладку clinet scopes и найдем там подвкладку evaluate.
![Alt text](img/evaluate.png?raw=true "Mappers evaluate")
Там мы увидим, что в access токене пользователя появился claim groups.


# Настройка Client Scopes
Перейдём в раздел Client Scopes и создадим новый Scope
Назовём его sAMAccountName, остальные настройки оставим по-умолчанию.
Затем перейдем в раздел mappers внутри созданного scope и добавим вот такой маппер:
![Alt text](img/sam-mapper-scope.png?raw=true "Scope Mapper")

Вернёмся в настройки клиента и перейдем во вкладку Client Scopes
Добавим созданный нами scope как Default Client Scope:
![Alt text](img/scope-in-client.png?raw=true "Client Scopes")
Теперь сделаем evaluate для произвольного пользователя и увидим claim sAMAccountName в его access токене.

## Настройка Ролей из AD групп
Настроим маппер, который превратит членство пользователей в группах в соответствующие роли.
Для этого вернемся в созданную ранее User Federation и создадим новый маппер:
![Alt text](img/group-to-role.png?raw=true "Client Scopes")

Если не отключить настройку Use Realm Roles Mapping, то роль будет создана глобально для всех групп.
Теперь если сделать Evaluate для пользователей с номером 6-10, то мы увидим, что у них в токене появилась роль "sXXX_keycloak". 