Shibboleth対応

1. Shibboleth IdPからの属性情報に基づき、ユーザへのロール割り当てをする

  • Idpから取得した属性情報は、以下の設定に従ってWEKOに渡される

  • 認証時にIdPより取得した属性情報に基づきログインユーザに対してロール割り当てを行う

    • IdP属性情報は以下とする

      • ロール:wekoSocietyAffiliation
    • IdP属性値に対するロール割り当ては以下とする

      • 「管理者」→システム管理者ロール'System Administrator'

      • 「学認 IdP 経由」→ 一般利用者ロール'Contributor'

      • 「機関内の Orthros 経由」→ リポジトリ管理者ロール'Repository Administrator'

      • 「機関外の Orthros 経由」→ コミュニティ管理者ロール'Community Administrator'

      • 「その他」→ ロール無'None'

    • 上記のIdP属性値とロールとの対応は、以下のコンフィグで設定する

    • IdP属性値がconfigに含まれないロールであった場合は、ロールを持たないユーザとなる

      • 設定値によって既定のロールが設定されている場合は、設定値を用いて既定のロールを付与する。
    • isMemberOfの属性値が付与されている場合、学認mAPグループからロールを割り当てる。

      • 以下のフォーマットに従う学認mAPグループを持つ場合、それぞれ以下のロールに割り当てる。

        • 「jc_roles_sysadm」→ システム管理者ロール'System Administrator'

        • 「jc_\_roles_repoadm」→ リポジトリ管理者ロール'Repository Administrator'

        • 「jc_\_roles_comadm」→ コミュニティ管理者ロール'Community Administrator'

        • 「jc_\_roles_contributor」→ 一般利用者ロール'Contributor'

2. Shibboleth IdPからの属性情報に基づき、サイトライセンス機能を制御する

  • 認証時にIdPより取得した属性情報に基づきログインユーザに対してサイトライセンス制御を行う

    • IdP属性情報は以下とする

      • サイトライセンス:wekoSiteUserWithinIpRange
    • IdP属性値に対するサイトライセンスは以下とする

      • "False"の場合は以下のエラーメッセージを表示し、ログイン不可とする

         JP: ログインに失敗しました。

         EN: Failed to login.

3. Shibbolethでのアカウント情報(ロール含む)の利用

  • シボレス経由でログインする都度、シボレス属性値をWEKO3のユーザ情報に反映

    • HTTP_WEKOID は、invenio の仕様でユニークである必要がある。

    • HTTP_WEKOSOCIETYAFFILIATIONについて、ロールの紐づけをconfig で指定できるものとし、configに含まれないロールであった場合は、WEKOのロールとしては設定しない

      • HTTP_WEKOSOCIETYAFFILIATIONに複数属性が含まれている場合は,複数ロールの割当を行えるようにする。(複数属性が含まれている場合は属性値を半角セミコロン「;」で区切られている)
    • 設定値WEKO_ACCOUNTS_SHIB_BIND_GAKUNIN_MAP_GROUPSが有効(True)の場合、isMemberOfについて、所属している学認mAPグループをWEKO3に紐づける。

      • 学認mAPグループはそのグループエンティティIDを名前に持つロールとして登録される。

      • ログイン時に所属している学認mAPグループをWEKO3のユーザーに付与する。

  • シボレスユーザの紐づけキー

4. 設定

WEKO_ACCOUNTS_SHIB_BIND_GAKUNIN_MAP_GROUPS = False

 WEKO_ACCOUNTS_GAKUNIN_GROUP_PATTERN_DICT = {
     "prefix": "jc",                             # Prefix
     "sysadm_group": "jc_roles_sysadm",          # システム管理者のグループ名
     "role_keyword": "roles",                    # ロールグループを表すキーワード
     "role_mapping": {
         "repoadm": "Repository Administrator",  # リポジトリ管理者グループ
         "comadm": "Community Administrator",    # コミュニティ管理者グループ
         "contributor": "Contributor"            # コントリビュータグループ
     }
 }
  • isMemberOf属性がない場合に付与する、IdP毎のデフォルトの学認mAPグループを設定する。

WEKO_ACCOUNTS_GAKUNIN_DEFAULT_GROUP_MAPPING = {}

WEKO_ACCOUNTS_IDP_ENTITY_ID = "https://weko3.example.org/idp/simplesamlphp"

WEKO_ACCOUNTS_GAKUNIN_GROUP_SUFFIX = "_gakunin_groups"

5. 実装

  • weko_accounts.views. shib_sp_login関数によって、IdPからのリクエストを処理する

    • WEKO_ACCOUNTS_SHIB_BIND_GAKUNIN_MAP_GROUPSがTrueのとき、学認mAPグループをWEKO3にロールとして作成する

      • Redisの情報を用いて、WEKO3の学認mAPグループリストを更新する

        • Redisから「とWEKO_ACCOUNTS_GAKUNIN_GROUP_SUFFIXを結合した値」をキーとして対応する機関の学認mAPグループをリストで取得する

          • は対象機関のIdPのentityID(変数 WEKO_ACCOUNTS_IDP_ENTITY_ID)からFQDNを取得し、"."または"-"を"_"に置き換えた値になる
        • 取得した学認mAPグループリストはロールとして登録されていないかチェックする。ロールとして登録されていない学認mAPグループの場合、新規ロールとしてaccounts_roleテーブルにレコード追加する

          • 学認mAPグループのインデックスツリーの権限の初期値を併せて登録する
    • リクエストにShib-Session-IDが含まれず、以下のコンフィグWEKO_ACCOUNTS_SHIB_LOGIN_ENABLEDがfalseの場合はエラーとしてWEKOのログイン画面に遷移する

    • weko_accounts.utils. parse_attributes関数によってリクエストの内容を確認し、必須の項目が含まれない場合はエラーとしてWEKOのログイン画面に遷移する

    • リクエストの内容にeppnが含まれず、かわりにHTTP_WEKOIDを利用しない設定である場合はエラーとしてWEKOのログイン画面に遷移する

    • セッション情報はRedisに保存する

    • リクエストの内容をもとに、shibboleth_userテーブルからeppnまたはHTTP_WEKOIDを使用してレコードの存在を確認する

  • 上記の処理で、shibboleth_userテーブルにレコードが存在する場合は、weko_accounts.views.shib_auto_login関数で続きの処理を行う

    • リクエストのShib-Session-IDとsession['shib_session_id']のどちらかに情報がある場合は、ログインする

    • この先の処理は以下設定キーに応じて流れが異なる

      • パス:https://github.com/RCOSDP/weko/blob/13c305a3048309dbda87a614ffedac18423820aa/modules/weko-accounts/weko_accounts/config.py

      • 設定キー:WEKO_ACCOUNTS_SKIP_CONFIRMATION_PAGE

      • WEKO_ACCOUNTS_SKIP_CONFIRMATION_PAGE が false の場合は weko_accounts.views.shib_login 関数で ID 選択画面に遷移する

        • 登録済みの ID でログインする場合は、weko_accounts.views.confirm_user 関数で続きの処理を行う

          • リクエストに、有効な WEKO アカウントとパスワードが含まれない場合は、WEKO のログイン画面に遷移する

          • リクエストの WEKO アカウントのメールアドレスを使用して、shibboleth_user テーブルにレコードを作成する

          • weko_accounts.api.ShibUser.check_in メソッドの中で、ロールの割り当てを行う

          • ログインする

        • リクエストにShib-Session-IDが含まれず、session['shib_session_id']に情報がある場合は、weko_accounts.api.ShibUser.new_relation_infoメソッドによってshibboleth_userテーブルにレコードを作成する

          • あわせて、userprofiles_userprofileテーブルに以下の内容でレコードを作成する

            • user_id:shibboleth_userテーブルに作成するレコードのidフィールドと同じ

            • timezone:コンフィグのデフォルト値

            • language:コンフィグのデフォルト値

            • username:shibboleth_userテーブルに作成するレコードのshib_user_nameフィールドと同じ

        • レコード作成の有無にかかわらず、weko_accounts.api.ShibUser.check_inメソッドの中で、ロールの割り当てを行う

        • レコード作成の有無にかかわらず、weko_accounts.api.ShibUser. gakunin_check_inメソッドの中で、学認mAPグループを更新する。

          • shibboleth_userroleテーブルでisMemberOf属性の値を基に、ユーザの学認mAPグループを割り当てる。
      • WEKO_ACCOUNTS_SKIP_CONFIRMATION_PAGE が true の場合は weko_accounts.views.confirm_user_without_page 関数で新規 ID および shibboleth_user テーブルのレコードの自動生成を行う

        • ログインする
    • 上記以外の場合は、WEKOのログイン画面に遷移する

  • shibboleth_userテーブルにレコードが存在しなかった場合は、weko_accounts.views.shib_login関数でID選択画面に遷移する

    • 登録済みのIDでログインする場合は、weko_accounts.views.confirm_user関数で続きの処理を行う

      • リクエストに、有効なWEKOアカウントとパスワードが含まれない場合は、WEKOのログイン画面に遷移する

      • リクエストのWEKOアカウントのメールアドレスを使用して、shibboleth_userテーブルにレコードを作成する

      • weko_accounts.api.ShibUser. check_inメソッドの中で、ロールの割り当てを行う

        • WEKO_ACCOUNTS_SHIB_BIND_GAKUNIN_MAP_GROUPSがTrueのとき、ログインユーザーに学認mAPグループを割り当てる

          • shibboleth_userroleテーブルでisMemberOf属性の値を基に、ユーザーの学認mAPグループをロールとして割り当てる

            • 学認mAPグループが割り当てられていないShibbolethログインユーザーの場合、WEKO_ACCOUNTS_GAKUNIN_DEFAULT_GROUP_MAPPINGの設定値を基に、ログインユーザーのデフォルトのロールを割り当てる

              • 認証されたIdPのentityIDの".", "-"を"_"に置き換えた値をキーとして利用して、デフォルトの学認mAPグループを取得して割り当てる

              • 該当グループが見つからない場合、またはWEKO_ACCOUNTS_GAKUNIN_DEFAULT_GROUP_MAPPINGに該当するキー値が存在しない場合はユーザーにロールを付与しない

          • 学認mAPグループの情報を基に、WEKO3のロールをShibbolethログインユーザーに割り当てる

            • 以下のフォーマットに従う場合、対応するWEKO3のロールをログインユーザーに割り当てる

              • 「jc_roles_sysadm」→ システム管理者ロール'System Administrator'

              • 「jc_\_roles_repoadm」→ リポジトリ管理者ロール'Repository Administrator'

              • 「jc_\_roles_comadm」→ コミュニティ管理者ロール'Community Administrator'

              • 「jc_\_roles_contributor」→ 一般利用者ロール'Contributor'

      • ログインする

    • 新規IDでログインする場合は、weko_accounts.views.shib_auto_login関数でログインする

      • weko_accounts.api.ShibUser. check_inメソッドの中で、ロールの割り当てを行う

        • WEKO_ACCOUNTS_SHIB_BIND_GAKUNIN_MAP_GROUPSがTrueのとき、ログインユーザーに学認mAPグループを割り当てる

          • shibboleth_userroleテーブルでisMemberOf属性の値を基に、ユーザの学認mAPグループをロールとして割り当てる

            • 学認mAPグループが割り当てられていないShibbolethログインユーザーの場合、WEKO_ACCOUNTS_GAKUNIN_DEFAULT_GROUP_MAPPINGの設定値を基に、ログインユーザーのデフォルトのロールを割り当てる

              • 認証されたIdPのentityIDの".", "-"を"_"に置き換えた値をキーとして利用して、デフォルトの学認mAPグループを取得して割り当てる

              • 該当グループが見つからない場合、またはWEKO_ACCOUNTS_GAKUNIN_DEFAULT_GROUP_MAPPINGに該当するキー値が存在しない場合はユーザーにロールを付与しない

          • 学認mAPグループの情報を基に、WEKO3のロールをShibbolethログインユーザーに割り当てる

            • 以下のフォーマットに従う場合、対応するロールをログインユーザーに割り当てる

              • 「jc_roles_sysadm」→ システム管理者ロール'System Administrator'

              • 「jc_\_roles_repoadm」→ リポジトリ管理者ロール'Repository Administrator'

              • 「jc_\_roles_comadm」→ コミュニティ管理者ロール'Community Administrator'

              • 「jc_\_roles_contributor」→ 一般利用者ロール'Contributor'

  • shibboleth_userテーブルにレコードを作成する場合は、あわせてユーザ関連テーブルも上書きする

    • 1) シボレス属性値をshibboleth_userテーブルに登録する

      • mail ⇒ shibboleth_user.shib_mail

      • HTTP_WEKOID ⇒ shibboleth_user.shib_user_name

      • HTTP_WEKOSOCIETYAFFILIATION ⇒shibboleth_user.shib_role_authority_name

    • 2) shibboleth_userテーブルから各テーブルに登録する

      • shibboleth_user.shib_mail ⇒ accounts_user.email

      • shibboleth_user.shib_user_name ⇒ userprofiles_userprofile.username

      • shibboleth_user.shib_role_authority_name ⇒ accounts_userrole.user_id,role_id

    • 1),2) どちらの登録の際も値のチェックは行わず、登録先の値を上書きする。

  • 更新履歴

日付 GitHubコミットID 更新内容

2023/08/31

353ba1deb094af5056a58bb40f07596b8e95a562 初版作成

2025/02/03

a62f7a5ea350ec1a811cb053dd27c54f284705a4 学認mAP対応

2025/03/12

407a511f757c1991078dc69f4560a2f64a42b615 ユーザープロビジョニング自動化追記、ロール情報修正

results matching ""

    No results matching ""