SimpleSAMLphpで属性をマッピングする

# "属性をマッピングする" とは

SimpleSAMLphp とはなにか、SAML とは、などの説明は割愛します。[こちら](https://simplesamlphp.org/)です。

今回やりたいことは、SAML で認証・認可を行う際に渡される属性の名前、およびその値を別名に変換することです。

# 属性名をマッピングする

[ここ](https://simplesamlphp.org/docs/stable/core:authproc_attributemap)を読みます。
あらゆる SP や IdP に対して同じように処理を行う場合は、config/config.php を編集します。個別に設定したい場合は、以下のファイルを編集します。

- SP において、特定の SP について設定 : config/authsources.php
- SP において、リモート IdP について設定 : metadata/saml20-idp-remote.php または metadata/shib13-idp-remote.php
- IdP において、ホスト IdP について設定 : metadata/saml20-idp-hosted.php または metadata/shib13-idp-hosted.php
- IdP において、特定の SP について設定 : metadata/saml20-sp-remote.php または metadata/shib13-sp-remote.php

## 記法

属性 "A" を属性 "B" にマッピングするとき、

```php:
'authproc' => array(
    50 => array(
        'class' => 'core:AttributeMap',
        'A' => 'B',
    ),
),
```

50 は 50 じゃなくてもいいです。
複数定義する時は、","区切りで並列に並べます。
authproc 内で属性マッピング以外にも様々なフィルターを設定できます。詳しくは[こちら](https://simplesamlphp.org/docs/stable/simplesamlphp-authproc)。

マッピングのルールを別ファイルで定義することもできます。
addurnprefix.php で定義した場合、(デフォルトで入ってます。 attributemap/addurnprefix.php)

```php:
'authproc' => array(
    50 => array(
        'class' => 'core:AttributeMap',
        'addurnprefix',
    ),
),
```

```php:addurnprefix.php
<?php

$attributemap = array(
    'sn'                         => 'urn:mace:dir:attribute-def:sn',
    'telephoneNumber'            => 'urn:mace:dir:attribute-def:telephoneNumber',
    'facsimileTelephoneNumber'   => 'urn:mace:dir:attribute-def:facsimileTelephoneNumber',
    'postalAddress'              => 'urn:mace:dir:attribute-def:postalAddress',
    'givenName'                  => 'urn:mace:dir:attribute-def:givenName',
    'homePhone'                  => 'urn:mace:dir:attribute-def:homePhone',
    'homePostalAddress'          => 'urn:mace:dir:attribute-def:homePostalAddress',
    'mail'                       => 'urn:mace:dir:attribute-def:mail',
    'mobile'                     => 'urn:mace:dir:attribute-def:mobile',
    'preferredLanguage'          => 'urn:mace:dir:attribute-def:preferredLanguage',
    'eduPersonPrincipalName'     => 'urn:mace:dir:attribute-def:eduPersonPrincipalName',
    'eduPersonAffiliation'       => 'urn:mace:dir:attribute-def:eduPersonAffiliation',
    'eduPersonScopedAffiliation' => 'urn:mace:dir:attribute-def:eduPersonScopedAffiliation',
    'eduPersonEntitlement'       => 'urn:mace:dir:attribute-def:eduPersonEntitlement',
    'eduPersonOrgDN'             => 'urn:mace:dir:attribute-def:eduPersonOrgDN',
    'eduPersonOrgUnitDN'         => 'urn:mace:dir:attribute-def:eduPersonOrgUnitDN',
);
```

# 属性値をマッピングする

ここまでは、属性の名前を変換していましたが、次は実際に渡される属性の値を変換します。
詳しくは、[ここ](https://simplesamlphp.org/docs/stable/core:authproc_attributevaluemap)を読みます。
属性名のマッピング同様に config.php などのファイルを編集します。

## 記法

属性 "A" が 属性値 "attr_1" または "attr_2" を含む時、属性 "B" に属性値 "attr_12" を加える場合、

```php:
'authproc' => array(
    50 => array(
        'class' => 'core:AttributeValueMap',
        'sourceattribute' => 'A',
        'targetattribute' => 'B',
        'values' => array(
            'attr_12' => array(
                'attr_1',
                'attr_2',
            ),
        ),
    ),
```

この場合、渡される属性のうち、属性 "A" は消去され、属性 "B" はもともと持っていた属性値に加えて "attr_12" が追加されます。
属性 "A" を残したい場合は %keep、属性 "B" がもともと持っていた属性値を新しく "attr_12" に変換したい場合には %replace を使います。

```php:
'authproc' => array(
    50 => array(
        'class' => 'core:AttributeValueMap',
        'sourceattribute' => 'A',
        'targetattribute' => 'B',
        '%replace',                  // 追加
        '%keep',                     // 追加
        'values' => array(
            'attr_12' => array(
                'attr_1',
                'attr_2',
            ),
        ),
    ),
```

values の配列内で複数の属性値について定義することができます。
属性名をマッピングする場合のように別ファイルで定義することができるのかどうかは不明です……。



まだまだ手探りなのでまた追記します。