標準機能では、IdPユーザとintra-martユーザを紐付けるには以下の方法があります。
・SAMLユーザマッピング画面からユーザ毎に登録する。
・SAMLユーザマッピング画面からCSVファイルを利用して、一括登録する
上記いずれの場合も、画面での操作が必要になります。
これを半自動化するために、SAMLユーザマッピングのCSVファイルを取り込み一括登録するジョブを作成します。
定期的にSAMLユーザマッピングのCSVファイルを作成し、ジョブスケジューラを利用してデータを取り込むことが可能です。
サンプルはシンプルなものとなっています。
必要であれば目的によってサンプルを改変して利用してください。
【サンプルの仕様】
ジョブパラメータ
path:CSVファイルパス(パブリックストレージからの相対パス)
prov_id:IdP登録時のID(IdP一覧画面から確認できます)
【サンプルの注意点】
・基本的に新規追加と変更を想定したシンプルなサンプルです。
・既存のデータ間のユーザの入れ替えには対応してません。(別途処理が必要です)
・トランザクション処理は行っていません。一件づつコミットが行われます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
package com.example.saml; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import jp.co.intra_mart.common.platform.log.Logger; import jp.co.intra_mart.foundation.context.Contexts; import jp.co.intra_mart.foundation.job_scheduler.Job; import jp.co.intra_mart.foundation.job_scheduler.JobResult; import jp.co.intra_mart.foundation.job_scheduler.JobSchedulerContext; import jp.co.intra_mart.foundation.job_scheduler.annotation.Parameter; import jp.co.intra_mart.foundation.job_scheduler.annotation.Parameters; import jp.co.intra_mart.foundation.job_scheduler.exception.JobExecuteException; import jp.co.intra_mart.foundation.saml.mapping.SAMLMappingManager; import jp.co.intra_mart.foundation.saml.mapping.entity.ImsamlUserMapping; import jp.co.intra_mart.foundation.saml.mapping.exception.IdpNotExistException; import jp.co.intra_mart.foundation.service.client.file.PublicStorage; public final class SamlMappingImporterJob implements Job { private static String PATH_KEY = "path"; private static String PROV_ID = "prov_id"; public SamlMappingImporterJob() { } @Override @Parameters({@Parameter(key = "prov_id", value = ""),@Parameter(key = "path", value = "saml_mapping.csv")}) public JobResult execute() throws JobExecuteException { final Logger logger = Logger.getLogger(); // ジョブスケジューラコンテキスト取得 final JobSchedulerContext jobSchedulerContext = Contexts.get(JobSchedulerContext.class); // パラメータの取得(prov_id) String provId = jobSchedulerContext.getParameter(PROV_ID); if (null == provId) { // 処理結果:異常 return JobResult.error("prov_id not found."); } provId = provId.trim(); if (provId.isEmpty()) { // 処理結果:異常 return JobResult.error("prov_id id Empty."); } // パラメータの取得(path) String path = jobSchedulerContext.getParameter(PATH_KEY); if (null == path) { // 処理結果:異常 return JobResult.error("path is not found."); } path = path.trim(); if (path.isEmpty()) { // 処理結果:異常 return JobResult.error("path is empty."); } // ファイルを取得とチェック final PublicStorage storage = new PublicStorage(path); try { if (!storage.exists()) { // 処理結果:異常 return JobResult.error(String.format("File not found.(%s)", path)); } } catch (IOException e) { final String errorMessage = String.format("Can not read the file.(%s)", path); logger.error(errorMessage, e); return JobResult.error(errorMessage); } // インポート処理 BufferedReader reader = null; int totalCount = 0; int insertCount = 0; int updateCount = 0; int skipCount = 0; final SAMLMappingManager manager = new SAMLMappingManager(); try { reader = new BufferedReader(new InputStreamReader(storage.open())); String line; while ((line = reader.readLine()) != null) { try { String[] record = line.split(",", 2); if (record.length == 2) { record[0] = record[0].trim(); record[1] = record[1].trim(); final ImsamlUserMapping mapping = manager.find(provId, record[0]); if (mapping != null) { // 更新 manager.update(provId, record[0], record[1], mapping.getProvUserCd(), mapping.getUserCd()); updateCount++; } else { // 新規追加 manager.insert(provId, record[0], record[1]); insertCount++; } } else { logger.warn(String.format("Skip for invalid format.(%s)", line)); skipCount++; } } catch (IdpNotExistException e) { String errorMessage = String.format("prov_id not found.(%s)", provId); logger.error(errorMessage, e); return JobResult.error(errorMessage); } catch (Exception e) { String errorMessage = String.format("Skip for import error.(%s)", line); logger.warn(errorMessage, e); skipCount++; } totalCount++; } } catch (IOException e) { final String errorMessage = String.format("Can not read the file.(%s)", path); logger.error(errorMessage, e); return JobResult.error(errorMessage); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { final String errorMessage = String.format("Can not close the file.(%s)", path); logger.error(errorMessage, e); return JobResult.error(String.format("Can not close the file.(%s)", path)); } } } final String message = String.format("Success import.( total:%d / insert:%d / update:%d / skip:%d )", totalCount, insertCount, updateCount, skipCount); return JobResult.success(message); } } |