Shibboleth対応
1. Shibboleth IdPからの属性情報に基づき、ユーザへのロール割り当てをする
Idpから取得した属性情報は、以下の設定に従ってWEKOに渡される
パス:https://github.com/RCOSDP/weko/blob/v0.9.22/nginx/login.php#L16-L20
「$_SERVER\[Idp側での属性名\]」で渡された情報を「$post_args\[WEKO側での属性名\]」として受け取る
認証時にIdPより取得した属性情報に基づきログインユーザに対してロール割り当てを行う
IdP属性情報は以下とする
- ロール:wekoSocietyAffiliation
IdP属性値に対するロール割り当ては以下とする
「管理者」→システム管理者ロール'System Administrator'
「図書館員」→リポジトリ管理者ロール'Repository Administrator'
「教員」→一般利用者ロール'Contributor'
「教官」→一般利用者ロール'Contributor'
上記のIdP属性値とロールとの対応は、以下のコンフィグで設定する
パス:https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L77-L82
設定キー:WEKO_ACCOUNTS_SHIB_ROLE_RELATION
IdP属性値がconfigに含まれないロールであった場合は、ロールを持たないユーザとなる
2. Shibboleth IdPからの属性情報に基づき、サイトライセンス機能を制御する
認証時にIdPより取得した属性情報に基づきログインユーザに対してサイトライセンス制御を行う
IdP属性情報は以下とする
- サイトライセンス:wekoSiteUserWithinIpRange
IdP属性値に対するサイトライセンスは以下とする
- "False"の場合は以下のエラーメッセージを表示し、ログイン不可とする
JP: ログインに失敗しました。
EN: Failed to login.
- "False"の場合は以下のエラーメッセージを表示し、ログイン不可とする
3. Shibbolethでのアカウント情報(ロール含む)の利用
シボレス経由でログインする都度、シボレス属性値をWEKO3のユーザ情報に反映
SHIB_ATTR_USER_NAME は、invenio の仕様でユニークである必要がある。
SHIB_ATTR_ROLE_AUTHORITY_NAMEについて、ロールの紐づけをconfig で指定できるものとし、configに含まれないロールであった場合は、WEKOのロールとしては設定しない
- SHIB_ATTR_ROLE_AUTHORITY_NAMEに複数属性が含まれている場合は,複数ロールの割当を行えるようにする。(複数属性が含まれている場合は属性値を半角セミコロン「;」で区切られている)
シボレスユーザの紐づけキー
SHIB_ATTR_EPPNとする
存在しない場合は、かわりにSHIB_ATTR_USER_NAMEを利用することができる
SHIB_ATTR_USER_NAMEを利用するかどうかは、以下のconfigで指定する
パス:https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L97
設定キー:WEKO_ACCOUNTS_SHIB_ALLOW_USERNAME_INST_EPPN
4. 実装
weko_accounts.views. shib_sp_login関数によって、IdPからのリクエストを処理する
リクエストにSHIB_ATTR_SESSION_IDが含まれず、以下のコンフィグWEKO_ACCOUNTS_SHIB_LOGIN_ENABLEDがfalseの場合はエラーとしてWEKOのログイン画面に遷移する
weko_accounts.utils. parse_attributes関数によってリクエストの内容を確認し、必須の項目が含まれない場合はエラーとしてWEKOのログイン画面に遷移する
必須項目は以下のコンフィグで設定する
パス(instance.cfg):
https://github.com/RCOSDP/weko/blob/v0.9.22/scripts/instance.cfg#L442-L448パス(config.py):
https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L64-L74設定キー:WEKO_ACCOUNTS_SSO_ATTRIBUTE_MAP
リクエストの内容にSHIB_ATTR_EPPNが含まれず、かわりにSHIB_ATTR_USER_NAMEを利用しない設定である場合はエラーとしてWEKOのログイン画面に遷移する
セッション情報はRedisに保存する
キーは、以下のコンフィグの値にログイン画面での入力値SHIB_ATTR_SESSION_IDを加えたものを用いる
設定キー:WEKO_ACCOUNTS_SHIB_CACHE_PREFIX
リクエストの内容をもとに、shibboleth_userテーブルからSHIB_ATTR_EPPNまたはSHIB_ATTR_USER_NAMEを使用してレコードの存在を確認する
上記の処理で、shibboleth_userテーブルにレコードが存在する場合は、weko_accounts.views.shib_auto_login関数で続きの処理を行う
リクエストのSHIB_ATTR_SESSION_IDとsession['shib_session_id']のどちらかに情報がある場合は、ログインする
リクエストにSHIB_ATTR_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のログイン画面に遷移する
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メソッドの中で、ロールの割り当てを行う
ログインする
新規IDでログインする場合は、weko_accounts.views.shib_auto_login関数でログインする
shibboleth_userテーブルにレコードを作成する場合は、あわせてユーザ関連テーブルも上書きする
1) シボレス属性値をshibboleth_userテーブルに登録する
SHIB_ATTR_MAIL ⇒ shibboleth_user.shib_mail
SHIB_ATTR_USER_NAME ⇒ shibboleth_user.shib_user_name
SHIB_ATTR_ROLE_AUTHORITY_NAME ⇒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 | 更新内容 |
---|---|---|
|
353ba1deb094af5056a58bb40f07596b8e95a562 | 初版作成 |