Skip to content

Commit 17d09f8

Browse files
authored
Merge pull request #31 from ayumi-nishida/fix/01b-def-role-attr-mapping
属性マッピング、デフォルトロールの値取得方法を修正
2 parents 71d87e7 + 0f85ae9 commit 17d09f8

1 file changed

Lines changed: 142 additions & 84 deletions

File tree

docs/spec/base/admin/ADMIN_14_19.md

Lines changed: 142 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@
224224

225225
- > 処理概要
226226
227-
画面表示時に、weko_accounts.admin.ShibSettingView.index メソッドを GET で呼び出して、instance.cfg または weko-accounts で以下のコンフィグから Shibboleth の許可設定を読み込む。
227+
画面表示時に、weko_accounts.admin.ShibSettingView.index 関数を GET で呼び出して、instance.cfg または weko-accounts で以下のコンフィグから Shibboleth の許可設定を読み込む。
228228

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

@@ -236,7 +236,7 @@
236236

237237
- 設定キー:WEKO_ACCOUNTS_SHIB_LOGIN_ENABLED
238238

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

241241
> \_app = LocalProxy(lambda: current_app.extensions\['weko-admin'\].app)
242242
>
@@ -305,33 +305,64 @@
305305

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

308-
- [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。
309-
JP:「デフォルトロール設定を更新しました」
310-
EN:「Updated Default Role settings」
308+
- [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。
309+
310+
(例:学認 IdP のロールを更新した場合)
311+
JP:「学認 IdP のロール設定を更新しました」
312+
EN:「Gakunin Role was updated.」
311313

312314
- > 関連モジュール
313315
314316
- weko_accounts
315317

316318
- > 処理概要
317319
318-
画面表示時に weko_accounts.admin.ShibSettingView.index メソッドを GET で呼び出して、weko-accounts で以下のコンフィグからデフォルトロール設定を読み込む
320+
ログイン時に、weko_accounts.views.\_adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成、もしくは更新する
319321

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

322324
- パス(config.py): (暫定)
323325
<https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L110-L116>
324326

325-
- 設定キー:WEKO_ACCOUNTS_GAKUNIN_ROLE, WEKO_ACCOUNTS_ORTHROS_INSIDE_ROLE,
326-
WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE, WEKO_ACCOUNTS_OTHERS_ROLE
327-
328-
[学認 IdP]の処理のみ記載
327+
- 設定キー:WEKO_ACCOUNTS_GAKUNIN_ROLE, WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE, WEKO_ACCOUNTS_EXTRA_ROLE
329328

330-
> if current_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']:
329+
> if AdminSettings.query.filter_by(name='default_role_settings').first() is None:
330+
>
331+
> new_setting = AdminSettings(
332+
>
333+
> id=8,
334+
>
335+
> name="default_role_settings",
336+
>
337+
> settings={
338+
>
339+
> "gakunin_role": \_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole'],
340+
>
341+
> "orthros_outside_role": \_app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole'],
342+
>
343+
> "extra_role": \_app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole']}
344+
>
345+
> )
346+
>
347+
> db.session.add(new_setting)
348+
>
349+
> db.session.commit()
350+
>
351+
> else:
352+
>
353+
> setting = AdminSettings.query.filter_by(name='default_role_settings').first()
354+
>
355+
> setting.settings = {
356+
>
357+
> "gakunin_role": \_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole'],
331358
>
332-
> gakunin_role = current_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']
359+
> "orthros_outside_role": \_app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole'],
360+
>
361+
> "extra_role": \_app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole']}
362+
>
363+
> db.session.commit()
333364
334-
選択肢の一覧はコンフィグから読み込んで HTML で生成する。
365+
選択肢の一覧はコンフィグから読み込んで weko_accounts.shibuser.createDefaultRoleSettingArea 関数 で生成する。
335366

336367
- パス(config.py): (暫定)
337368
<https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L121-L144>
@@ -342,27 +373,32 @@
342373

343374
> role_list = current_app.config['WEKO_ACCOUNTS_ROLE_LIST']
344375
345-
- shibuser.html
346-
> const defaultRoleList = document.getElementById('default-role-list').getAttribute('data-value');
347-
>
348-
> const gakuninRoleList = document.getElementById('gakunin-role-list');
349-
>
350-
> gakuninRoleList.appendChild(createSelectList(0, 'role', gakuninRoleList.getAttribute('data-value')));
351-
>
352-
> ※ createSelectList() 選択肢を作成するメソッド
376+
[保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数で、以下のようにして admin_settings テーブルに設定を保存する。
377+
378+
- 最初に roles を宣言する(GET,POST 関わらず)
353379

354-
[保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index メソッドを POST で呼び出して、以下のようにしてコンテキストに設定を保存する。
380+
> default_roles = AdminSettings.get('default_role_settings', dict_to_object=False)
381+
>
382+
> roles = {
383+
>
384+
> 'gakunin_role': default_roles.get('gakunin_role', current_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE']['defaultRole']),
385+
>
386+
> 'orthros_outside_role': default_roles.get('orthros_outside_role', current_app.config['WEKO_ACCOUNTS_ORTHROS_OUTSIDE_ROLE']['defaultRole']),
387+
>
388+
> 'extra_role': default_roles.get('extra_role', current_app.config['WEKO_ACCOUNTS_EXTRA_ROLE']['defaultRole'])
389+
>
390+
> }
355391
356-
- [学認 IdP]の処理のみ記載
357-
> new_gakunin_role = request.form.get('roleLists0', '0')
392+
- POST で更新する
393+
> for key in roles:
358394
>
359-
> if gakunin_role != new_gakunin_role:
395+
> if roles[key] != new_roles[key]:
360396
>
361-
> gakunin_role = new_gakunin_role
397+
> roles[key] = new_roles[key]
362398
>
363-
> \_app.config['WEKO_ACCOUNTS_GAKUNIN_ROLE'] = new_gakunin_role
399+
> flash(_(f'{key.replace("_", " ").title()} was updated.'), category='success')
364400
>
365-
> flash(\_('Gakunin IdP role was updated.'), category='success')
401+
> AdminSettings.update('default_role_settings', roles)
366402
367403
### Shibboleth 属性と WEKO3 属性値のマッピング操作
368404

@@ -384,17 +420,19 @@
384420

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

387-
- [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。
388-
JP:「属性マッピング設定を更新しました」
389-
EN:「Updated Attribute Mapping settings」
423+
- [保存(Save)]ボタンを押すと、設定内容を保存し、以下のメッセージを画面上部に表示する。
424+
425+
(例:shib_eppn を更新した場合)
426+
JP:「属性マッピング設定(shib_eppn)を更新しました」
427+
EN:「Shibboleth Eppn mapping was updated.」
390428

391429
- > 関連モジュール
392430
393431
- weko_accounts
394432

395433
- > 処理概要
396434
397-
画面表示時に、weko_accounts.admin.ShibSettingView.index メソッドを GET で呼び出して、weko-accounts で以下のコンフィグから WEKO3 属性のマッピング設定を読み込む
435+
ログイン時に、weko_accounts.views.\_adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成、もしくは更新する
398436

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

@@ -403,58 +441,70 @@
403441
404442
- > 設定キー:WEKO_ACCOUNTS_ATTRIBUTE_MAP
405443
406-
> if current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']:
444+
> if AdminSettings.query.filter_by(name='attribute_mapping').first() is None:
445+
>
446+
> new_setting = AdminSettings(id=9, name="attribute_mapping", settings=\_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP'])
447+
>
448+
> db.session.add(new_setting)
449+
>
450+
> db.session.commit()
407451
>
408-
> weko_eppn_value = current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_eppn']
452+
> else:
409453
>
410-
> weko_role_authority_name_value = current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_role_authority_name']
454+
> setting = AdminSettings.query.filter_by(name='attribute_mapping').first()
411455
>
412-
> weko_mail_value = current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_mail']
456+
> setting.settings = \_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']
413457
>
414-
> weko_user_name_value = current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_user_name']
458+
> db.session.commit()
415459
416-
選択肢の一覧はコンフィグから読み込んで HTML で生成する。
460+
選択肢の一覧はコンフィグから読み込んで weko_accounts.shibuser.createAttrMapSettingArea 関数 で生成する。
417461

418462
- > パス(config.py): (暫定)
419463
> <https://github.com/RCOSDP/weko/blob/v0.9.22/modules/weko-accounts/weko_accounts/config.py#L85-L100>
420464
421465
- > 設定キー:WEKO_ACCOUNTS_ATTRIBUTE_LIST
422466
423467
- admin.py
468+
424469
> role_list = current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_LIST']
425-
- shibuser.html
426-
> const defaultAttrList = document.getElementById('default-attr-list').getAttribute('data-value');
427-
>
428-
> const eppnAttrList = document.getElementById('eppn-attr-list');
429-
>
430-
> eppnAttrList.appendChild(createSelectList(0, 'attr', eppnAttrList.getAttribute('data-value')));
431-
>
432-
> ※ createSelectList() 選択肢を作成するメソッド(デフォルトロール選択肢作成と同一)
433470
434-
[保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index メソッドを POST で呼び出して、以下のようにしてコンテキストに設定を保存する
471+
[保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数で、以下のようにして admin_settings テーブルに設定を保存する
435472

436-
- ※ [shib_eppn] 部分の処理のみ記載
473+
- 最初に attributes を宣言する(GET,POST 関わらず)
437474

438-
> if weko_eppn_value != new_weko_eppn_value:
475+
> attribute_mappings = AdminSettings.get('attribute_mapping', dict_to_object=False)
476+
>
477+
> attributes = {
478+
>
479+
> 'shib_eppn': attribute_mappings.get('shib_eppn', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_eppn']),
480+
>
481+
> 'shib_role_authority_name': attribute_mappings.get('shib_role_authority_name', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_role_authority_name']),
482+
>
483+
> 'shib_mail': attribute_mappings.get('shib_mail', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_mail']),
439484
>
440-
> weko_eppn_value = new_weko_eppn_value
485+
> 'shib_user_name': attribute_mappings.get('shib_user_name', current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_user_name'])
441486
>
442-
> with current_app.app_context():
487+
> }
488+
489+
- POST で更新する
490+
> for key in attributes:
491+
>
492+
> if attributes[key] != new_attributes[key]:
443493
>
444-
> current_app.config['WEKO_ACCOUNTS_ATTRIBUTE_MAP']['shib_eppn'] =
494+
> attributes[key] = new_attributes[key]
445495
>
446-
> new_weko_eppn_value
496+
> flash(_(f'{key.replace("_", " ").title()} mapping was updated.'), category='success')
447497
>
448-
> flash(\_('shib_eppn mapping was updated.'), category='success')
498+
> AdminSettings.update('attribute_mapping', attributes)
449499
450500
属性マッピングは Invenio コマンドでも更新出来るようにする。
451501

452-
weko-accounts/cli.py に属性マッピングを更新するメソッドを作成する
502+
weko-admin/cli.py に update_attribute_mapping 関数を作成
453503

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

456506
- コマンド例
457-
> invenio update-attribute-mapping --shib_eppn 'eduPersonPrincipalName' --shib_mail 'mail'
507+
> invenio admin_settings mapping_update --shib_eppn 'eduPersonPrincipalName' --shib_mail 'mail'
458508
459509
### ブロックユーザーの管理
460510

@@ -481,17 +531,25 @@
481531

482532
- > 処理概要
483533
484-
- ブロックユーザーの ePPN 管理は admin_settings テーブルで行う。<br>
485-
※ 初回のみ、テーブルにレコードを追加する手順が必要となる。
534+
- ブロックユーザーの ePPN 管理は admin_settings テーブルで行う。
486535

487-
- レコードの内容
488-
> id: 6(連番)<br>
489-
> name: blocked_user_settings<br>
490-
> settings: {"blocked_ePPNs": []}
491-
- populate-instance.sh の create-admin-settings-begin 付近に以下文を追加する。
492-
> ${INVENIO_WEB_INSTANCE} admin_settings create_settings \
493-
> 6 "blocked_user_settings" \
494-
> "{'blocked_ePPNs': []}"
536+
- レコードがない場合、ログイン時に weko_accounts.views.\_adjust_shib_admin_DB 関数で admin_settings テーブルを設定ファイルの内容で新規作成する。
537+
538+
> if AdminSettings.query.filter_by(name='blocked_user_settings').first() is None:
539+
>
540+
> new_setting = AdminSettings(
541+
>
542+
> id=6,
543+
>
544+
> name="blocked_user_settings",
545+
>
546+
> settings={"blocked_ePPNs": []}
547+
>
548+
> )
549+
>
550+
> db.session.add(new_setting)
551+
>
552+
> db.session.commit()
495553
496554
- システム管理者、およびリポジトリ管理者はブロックしたいユーザーの ePPN を settings.blocked_ePPNs に追加する。<br>
497555

@@ -531,23 +589,23 @@
531589
>
532590
> }
533591
534-
- [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index メソッドを POST で呼び出して、以下のようにしてテーブルを更新する。
592+
- [保存(Save)]ボタンを押すと、weko_accounts.admin.ShibSettingView.index 関数を POST で呼び出して、以下のようにしてテーブルを更新する。
535593

536-
> new_block_user_list = request.form.get('block-eppn-option-list', '0')
537-
>
538-
> if block_user_list != new_block_user_list:
539-
>
540-
> new_eppn_list = json.loads(new_block_user_list)
541-
>
542-
> new_eppn_list.sort()
543-
>
544-
> updateSettings = {'blocked_ePPNs': new_eppn_list}
545-
>
546-
> AdminSettings.update('blocked_user_settings', updateSettings)
547-
>
548-
> flash(\_('Blocked user list was updated.'), category='success')
549-
>
550-
> block_user_list = json.dumps(new_eppn_list)
594+
> new_block_user_list = request.form.get('block-eppn-option-list', '0')
595+
>
596+
> if block_user_list != new_block_user_list:
597+
>
598+
> new_eppn_list = json.loads(new_block_user_list)
599+
>
600+
> new_eppn_list.sort()
601+
>
602+
> updateSettings = {'blocked_ePPNs': new_eppn_list}
603+
>
604+
> AdminSettings.update('blocked_user_settings', updateSettings)
605+
>
606+
> flash(\_('Blocked user list was updated.'), category='success')
607+
>
608+
> block_user_list = str(new_eppn_list).replace('"', '\\"')
551609
552610
<!-- end list -->
553611

@@ -571,10 +629,10 @@
571629
</tr>
572630
<tr class="even">
573631
<td><blockquote>
574-
<p>2025/02/-</p>
632+
<p>2025/03/-</p>
575633
</blockquote></td>
576634
<td></td>
577-
<td>Shibboleth 管理画面を追加</td>
635+
<td>Shibboleth 管理画面の機能を追加</td>
578636
</tr>
579637
</tbody>
580638
</table>

0 commit comments

Comments
 (0)