Shibboleth

  • 目的・用途

本画面の機能は以下の通りである。

・システム利用者がログインする際のシボレスユーザーの許可/拒否を設定

・システム利用者のデフォルトロールの設定

・Shibboleth 属性と WEKO3 属性値のマッピング操作

・ブロックユーザーの管理

  • 利用方法

【Administration > 設定(Setting) > Shibboleth画面】にて操作を行う。

  • 利用可能なロール

ロール システム

管理者
リポジトリ

管理者
コミュニティ

管理者
登録ユーザー 一般ユーザー ゲスト

(未ログイン)
利用可否
  • 画面説明

    • 図 1 管理画面:Shibboleth

No 項目名 表示 形式 I/O データ取得元API 備考
Shibboleth有効化 Shibbolethを有効にする ラジオボタン N/A Shibboleth認証によるログインを有効化する。
Shibboleth無効化 Shibbolethを無効にする ラジオボタン N/A Shibboleth認証によるログインを無効化する。
[学認IdP]経由ログイン

デフォルトロール設定
[ System Administrator, Repository Administrator, Contributor, Community Administrator, (ロール無)] リストボックス N/A [学認IdP]経由でログインしたユーザーのデフォルトロールを設定する。

[機関外のOrthros]経由ログイン

デフォルトロール設定
[ System Administrator, Repository Administrator, Contributor, Community Administrator, (ロール無)] リストボックス N/A [機関外のOrthros]経由でログインしたユーザーのデフォルトロールを設定する。
[上記以外のIdP]経由ログイン

デフォルトロール設定
[ System Administrator, Repository Administrator, Contributor, Community Administrator, (ロール無)] リストボックス N/A [学認IdP]、[Orthros]以外の方法でログインしたユーザーのデフォルトロールを設定する。
shib_eppn

属性マッピング
['mail', 'sn', 'o', 'ou', 'givenName', 'displayName', 'eduPersonAffiliation', 'eduPersonPrincipalName', 'eduPersonEntitlement', 'eduPersonScopedAffiliation', 'eduPersonTargetedID', 'eduPersonAssurance', 'eduPersonUniqueId', 'eduPersonOrcid'] リストボックス N/A 初期値は'eduPersonPrincipalName'
shib_role_authority_name

属性マッピング
['mail', 'sn', 'o', 'ou', 'givenName', 'displayName', 'eduPersonAffiliation', 'eduPersonPrincipalName', 'eduPersonEntitlement', 'eduPersonScopedAffiliation', 'eduPersonTargetedID', 'eduPersonAssurance', 'eduPersonUniqueId', 'eduPersonOrcid'] リストボックス N/A 初期値は'eduPersonAffiliation'
shib_mail

属性マッピング
['mail', 'sn', 'o', 'ou', 'givenName', 'displayName', 'eduPersonAffiliation', 'eduPersonPrincipalName', 'eduPersonEntitlement', 'eduPersonScopedAffiliation', 'eduPersonTargetedID', 'eduPersonAssurance', 'eduPersonUniqueId', 'eduPersonOrcid'] リストボックス N/A 初期値は'mail'
shib_user_name

属性マッピング
['mail', 'sn', 'o', 'ou', 'givenName', 'displayName', 'eduPersonAffiliation', 'eduPersonPrincipalName', 'eduPersonEntitlement', 'eduPersonScopedAffiliation', 'eduPersonTargetedID', 'eduPersonAssurance', 'eduPersonUniqueId', 'eduPersonOrcid'] リストボックス N/A 初期値は'displayName'
ブロックユーザー

ePPN入力欄
テキストボックス N/A アカウント作成前にブロックしたい新規ユーザーのePPNを入力する。

ワイルドカードでの指定も可能。
ブロックユーザー

追加ボタン
追加 ボタン N/A ⑩で入力したePPNを⑫ブロックユーザー一覧に登録する。
登録済み

ブロックユーザー一覧
セレクトボックス N/A 登録済みのブロックユーザー一覧。
登録済み

ブロックユーザー削除ボタン
削除 ボタン N/A ⑫のリストから選択したユーザーを一覧から削除できる。
保存ボタン 保存 ボタン O 設定画面での変更内容を保存する。

シボレスユーザーの許可拒否を設定

  • 機能内容

    • 画面には以下のラジオボタンがあり、現在の許可/拒否設定を反映して表示される。

      図 2

      • 「Shibbolethを有効にする」(Enable Shibboleth Authentication)

        • シボレスユーザーを許可とし、「Shibboleth User」ボタンをログイン画面に表示させる。
      • 「Shibbolethを無効にする」(Disable Shibboleth Authentication)

        • シボレスユーザーを拒否とし、「Shibboleth User」ボタンをログイン画面に表示させない。
    • [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。

      JP:「Shibboleth設定を更新しました」

      EN:「Updated Shibboleth settings」

  • 関連モジュール

    • weko_accounts
  • 処理概要

    • 画面表示時に、weko_accounts.admin.ShibSettingView.index 関数を GET で呼び出して、instance.cfg または weko-accounts で以下のコンフィグから Shibbolethの許可設定を読み込む。

      両方で設定されている場合、instance.cfgの設定が優先される。また、画面で設定を変更した場合は、その変更が最優先される。

    • [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index関数をPOSTで呼び出して、以下のようにしてコンテキストに設定を保存する。

_app = LocalProxy(lambda: current_app.extensions['weko-admin'].app)

※上記はShibSettingViewクラスの外で定義

if shib_flg != new_shib_flg:

shib_flg = request.form.get('shibbolethRadios', '0')

if shib_flg == '1':

_app.config['WEKO_ACCOUNTS_SHIB_LOGIN_ENABLED'] = True

else:

_app.config['WEKO_ACCOUNTS_SHIB_LOGIN_ENABLED'] = False

デフォルトロールの設定

  • 機能内容

    • [既定のロール]ではシステム利用者のデフォルトロールを設定することができる。

      図 3

    • 候補として選択できるロールは以下の 5 種類

      • System Administrator(システム管理者)

      • Repository Administrator(リポジトリ管理者)

      • Community Administrator(コミュニティ管理者)

      • Contributor(登録ユーザー)

      • ロール無(一般ユーザー)

    • システム利用者は以下のように分類されており、それぞれのデフォルトロールを変更することができる。

      • [学認 IdP]

        • 学認 IdP からログインしたシステム利用者のデフォルトロールを設定できる。

          初期値は「Contributor(登録ユーザー)」

      • [機関外の Orthros]

        • 機関外の Orthros からログインしたシステム利用者のデフォルトロールを設定できる。

          初期値は「Community Administrator(コミュニティ管理者)」

          ※[機関内の Orthros]からログインしたシステム利用者には「Repository Administrator(リポジトリ管理者)」が付与される。

          [機関内の Orthros]は設定画面からは変更しない。

      • [上記以外の IdP]

        • 上記以外の IdP からログインしたシステム利用者のデフォルトロールを設定できる。

          初期値は「ロール無(一般ユーザー)」

      • ※(補足)「機関内外」の判定方法

        • 機関内外の判定は GakuNinmAP から取得できる[o]属性('organizationName')で判定する。

          取得した[o]属性が[機関の'organizationName']と一致したら[機関内]と判定することができる。

    • [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。

      (例:学認 IdP のロールを更新した場合)

      JP:「学認 IdP のロール設定を更新しました」

      EN:「Gakunin Role was updated.」

  • 関連モジュール

    • weko_accounts
  • 処理概要

    • ログイン時に、weko_accounts.views._adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成、もしくは更新する。

      また、画面で設定を変更した場合は、その変更が最優先される。

      • パス(config.py):

        https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L110-L116

      • 設定キー:WEKO_ACCOUNTS_GAKUNIN_ROLE, WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE, WEKO_ACCOUNTS_EXTRA_ROLE

        if AdminSettings.query.filter_by(name='default_role_settings').first() is None:

        new_setting = AdminSettings(

        id=8,

        name="default_role_settings",

        settings={

        "gakunin_role": _app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole'],

        "orthros_outside_role": _app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole'],

        "extra_role": _app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole']}

        )

        db.session.add(new_setting)

        db.session.commit()

        else:

        setting = AdminSettings.query.filter_by(name='default_role_settings').first()

        setting.settings = {

        "gakunin_role": _app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole'],

        "orthros_outside_role": _app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole'],

        "extra_role": _app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole']}

        db.session.commit()

    • 選択肢の一覧はコンフィグから読み込んで weko_accounts.shibuser.createDefaultRoleSettingArea 関数 で生成する。

    • [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数で、以下のようにして admin_settings テーブルに設定を保存する。

      • 最初に roles を宣言する(GET,POST 関わらず)

        default_roles = AdminSettings.get('default_role_settings', dict_to_object=False)

        roles = {

        'gakunin_role': default_roles.get('gakunin_role', current_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole']),

        'orthros_outside_role': default_roles.get('orthros_outside_role', current_app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole']),

        'extra_role': default_roles.get('extra_role', current_app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole'])

        }

      • POST で更新する

        for key in roles:

        if roles[key] != new_roles[key]:

        roles[key] = new_roles[key]

        flash((f'{key.replace("", " ").title()} was updated.'), category='success') Add commentMore actions AdminSettings.update('default_role_settings', roles)

Shibboleth 属性と WEKO3 属性値のマッピング操作

  • 機能内容

    • [属性マッピング]では WEKO3 属性のマッピングを行うことができる。

      図 4

    • マッピングの設定を行えるのは以下の 4 項目

      • shib_eppn

      • shib_role_authority_name

      • shib_mail

      • shib_user_name

    • 選択肢からマッピングしたい属性値を設定する。

    • [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。

      (例:shib_eppn を更新した場合)

      JP:「属性マッピング設定(shib_eppn)を更新しました」

      EN:「Shibboleth Eppn mapping was updated.」

  • 関連モジュール

    • weko_accounts
  • 処理概要

    • ログイン時に、weko_accounts.views._adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成、もしくは更新する。

      また、画面で設定を変更した場合は、その変更が最優先される。

      • パス(config.py):

        https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L77-L82

      • 設定キー:WEKO_ACCOUNTS_ATTRIBUTE_MAP

        if AdminSettings.query.filter_by(name='attribute_mapping').first() is None:

        new_setting = AdminSettings(id=9, name="attribute_mapping", settings=_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP'])

        db.session.add(new_setting)

        db.session.commit()

        else:

        setting = AdminSettings.query.filter_by(name='attribute_mapping').first()

        setting.settings = _app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']

        db.session.commit()

    • 選択肢の一覧はコンフィグから読み込んで weko_accounts.shibuser.createAttrMapSettingArea 関数 で生成する。

    • [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数で、以下のようにして admin_settings テーブルに設定を保存する。

      • 最初に attributes を宣言する(GET,POST 関わらず)

        attribute_mappings = AdminSettings.get('attribute_mapping', dict_to_object=False)

        attributes = {

        'shib_eppn': attribute_mappings.get('shib_eppn', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_eppn']),

        'shib_role_authority_name': attribute_mappings.get('shib_role_authority_name', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_role_authority_name']),

        'shib_mail': attribute_mappings.get('shib_mail', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_mail']),

        'shib_user_name': attribute_mappings.get('shib_user_name', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_user_name'])

        }

      • POST で更新する

        for key in attributes:

        if attributes[key] != new_attributes[key]:

        attributes[key] = new_attributes[key]

        flash((f'{key.replace("", " ").title()} mapping was updated.'), category='success')

        AdminSettings.update('attribute_mapping', attributes)

    • 属性マッピングは Invenio コマンドでも更新出来るようにする。

    • weko-admin/cli.py に update_attribute_mapping 関数を作成。

    • マッピングを変更したい属性名(shib_eppn や shib_mail など)と、マッピングしたい属性値('eduPersonPrincipalName'や'mail'など)をコマンド送信することで更新を行う。

      • コマンド例

        invenio admin_settings mapping_update --shib_eppn 'eduPersonPrincipalName' --shib_mail 'mail'

ブロックユーザーの管理

  • 機能内容

    • [ブロックユーザー]ではあらかじめログインをブロックしたいシステム利用者の ePPN を登録しておくことができる。

      図 5

    • システム利用者が WEKO3 アカウントを未所持の場合、アカウント作成前にブロックすることができる

    • ePPN はワイルドカードでの指定も可能で、特定の機関からのシステム利用者を丸ごとブロックすることも可能

      • ワイルドカードに指定された機関の中にすでに WEKO3 アカウントの所持者の ePPN が含まれていた場合でもログインブロックの対象として登録可能。
    • WEKO3 のアカウント所持者をブロックする場合、[保存(Save)]ボタンを押した際にアラートを表示した上でブロックの一覧に追加する。

    • [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。

      JP:「ユーザーログインブロック設定を更新しました」

      EN:「Updated User Login Block settings」

  • 関連モジュール

    • weko_accounts
  • 処理概要

    • ブロックユーザーの ePPN 管理は admin_settings テーブルで行う。

    • レコードがない場合、ログイン時に weko_accounts.views._adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成する。

      if AdminSettings.query.filter_by(name='blocked_user_settings').first() is None:

      new_setting = AdminSettings(

      id=6,

      name="blocked_user_settings",

      settings={"blocked_ePPNs": []}

      )

      db.session.add(new_setting)

      db.session.commit()

    • システム管理者、およびリポジトリ管理者はブロックしたいユーザーの ePPN を settings.blocked_ePPNs に追加する。

      • ユーザー操作

        • 追加

          [ブロックユーザー]の上部テキストボックスに ePPN を入力し、[追加]ボタンを押下する。

          下部セレクトボックスに 入力した ePPN が追加された後、最下部の[保存]ボタンを押下することでテーブルに追加される。

        • 削除

          ブロックユーザーの一覧(セレクトボックス)よりブロックを解除したいユーザーの ePPN を選択肢、[削除]ボタンを押下する。

      • ブロックユーザーの一覧

        ブロックユーザーの一覧はセレクトボックスで確認できる。

        セレクトボックスの内容はセレクトボックスのすぐ上にある隠れリストに格納し、POST で送信のうえ更新を行う。

        \

        // ブロックユーザー一覧を更新

        function updateBlockUserList() {

        let blockUserEPPNList = [];Add commentMore actions

        const selectBox = document.getElementById('block-user-lists');

        const optionValues = Array.from(selectBox.options).map(option => option.value);

        blockUserEPPNList = optionValues;

        document.getElementById('block-eppn-option-list').value = JSON.stringify(blockUserEPPNList);

        }

    • [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数を POST で呼び出して、以下のようにしてテーブルを更新する。

      new_block_user_list = request.form.get('block-eppn-option-list', '0')

      if block_user_list != new_block_user_list:

      new_eppn_list = json.loads(new_block_user_list)

      new_eppn_list.sort()

      updateSettings = {'blocked_ePPNs': new_eppn_list}

      AdminSettings.update('blocked_user_settings', updateSettings)

      flash(_('Blocked user list was updated.'), category='success')

      block_user_list = str(new_eppn_list).replace('"', '\"')

  • 更新履歴

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

2023/08/31

353ba1deb094af5056a58bb40f07596b8e95a562 初版作成

2025/03/12

0f85ae90a32efc2981229ffdb9dae67b30f8d6c6 Shibboleth 管理画面の機能を追加

results matching ""

    No results matching ""