セキュリティーの操作
ここではアプリケーションを開発する際のクライアント側のセキュリティーに関するタスクをいくつか説明します。
LoginContext の取得
Java™ Authentication and Authorization (JAAS) ログインは、LoginContext オブジェクトの取得、LoginContext.login メソッドの呼び出し、実際の操作を実行するログイン・ユーザーの偽装という 3 つの手順からなります。
LoginContext オブジェクトを取得するには、JAAS ログイン構成ファイルの特定の構成を示すタグが必要です。ログイン構成ファイルに「other」の項目がある場合は、LoginContext のコンストラクターを呼び出すときにどのタグを使用するかは問題ではありません。なぜなら、呼び出しは構成ファイルの項目「other」にフォールバックされるからです。また、認証情報 (ユーザー名とパスワード) を提供するために CallbackHandler を指定する必要もあります。この情報を入力するプロンプトを表示する場合は、com.sun.security.auth.callback.DialogCallbackHandler (以下の例に記載)、TextCallbackHandler などの、Sun のサンプル・コールバック・ハンドラーの新しいインスタンスを指定できます。
login メソッドがコールバック・ハンドラーを呼び出すと、このハンドラーが Oracle WebLogic または IBM® WebSphere® Application Server ハンドラーの場合、認証情報が認証されます。JBoss の場合、認証情報は、サーバーとの対話でオブジェクトのフェッチ、保存、または検索のために使用されるまでは認証されません。認証情報の認証での問題 (無効なパスワードなど) は、認証するために使用しているアプリケーション・サーバーに応じて、さまざまな場所で発生する可能性があります。JBoss で login メソッドの呼び出しが正常に完了したとしても、認証情報が認証されたことにはなりません。
UserContext オブジェクトは、Content Engine Java API にアクセスする各スレッドに関連付けられています。API で Content Engine サーバーにアクセスする呼び出しを行う前に、UserContext.pushSubject を呼び出すことにより、JAAS Subject はスレッドに関連付けられます。UserContext クラスが提供するヘルパー・メソッドは、一般的なユーザー名/パスワード方式で JAAS ログインを実行できることに注意してください。通常、アプリケーションが Web サービス・トランスポートではなく Content Engine Java API を使用している場合に、この方法が採用されます。次の例では、後続のすべての Content Engine Java API 呼び出しで EJB トランスポートが使用されています。Web サービス・トランスポートを代わりに使用するには、UserContext.createSubject 呼び出しの JAAS 構成スタンザ名を「FileNetP8」から「FileNetP8WSI」に変更します。
Java の例
// Perform the login.
static void performLogin(
Connection con,
String userName, // 例: "username@testdom.local"
String passWord) throws Exception
{
// *** Step 1: Obtain login context. ***
// コールバック・ハンドラーを決定する
CallbackHandler handler = null;
if (userName != null)
{
// Call user-created class that implements CallbackHandler.
handler = new UserPasswordHandler(userName, passWord);
}
else
{
handler = new DialogCallbackHandler();
}
// ログイン・コンテキストを取得する
LoginContext lc = new LoginContext("mysystem", handler);
// *** ステップ 2: ログイン・メソッドを呼び出す ***
// ログインを試行する
try
{
lc.login();
System.out.println("Login succeeded");
}
catch (Exception exc)
{
System.out.println("Login failed");
throw exc;
}
// *** ステップ 3: ログイン済みユーザーを偽装する***
// ユーザー・コンテキストを取得する
UserContext uc = UserContext.get();
// Determine subject.
Subject sub = null;
if (userName != null)
{
// Example for EJB transport. スタンザ名は EJB の場合は FileNetP8、WSI の場合は FileNetP8WSI です。
sub = UserContext.createSubject(con, userName, passWord, "FileNetP8");
}
else
{
sub = lc.getSubject();
}
// JAAS Subject を UserContext に関連付ける
uc.pushSubject(sub);
try
{
// 処理を実行します
}
finally
{
uc.popSubject();
}
}
アクセス権限の設定
以下のコード例は、ドキュメントのアクセス権リストに追加された新規ユーザーに対してアクセス権を設定する方法を示しています。AccessPermission オブジェクトが作成され、新規ユーザーについての権限情報が設定され、ドキュメントのアクセス権リストに追加されます。 アクセス権の組み合わせを表すために定数が使用され、これらが AccessPermission オブジェクトの AccessMask プロパティーに設定されます。
Java の例
// 定数でアクセス権の組み合わせを指定。
private static final int LOAN_CREATOR = AccessRight.READ_ACL.getValue() | AccessRight.CHANGE_STATE.getValue() | AccessRight.CREATE_INSTANCE.getValue()
| AccessRight.VIEW_CONTENT.getValue() |AccessRight.MINOR_VERSION.getValue() | AccessRight.UNLINK.getValue()
| AccessRight.LINK.getValue() |AccessRight.WRITE.getValue() | AccessRight.READ.getValue();
private static final int LOAN_REVIEWER = AccessRight.VIEW_CONTENT.getValue() | AccessRight.READ_ACL.getValue() | AccessRight.READ.getValue()
| AccessRight.LINK.getValue();
// ドキュメントのアクセス権リストに新規ユーザーを追加。ユーザーの
// グループ・メンバーシップによって権限が決定される。
private AccessPermissionList setPermissions(AccessPermissionList apl, User newUser)
{
AccessPermission ap = Factory.AccessPermission.createInstance();
ap.set_GranteeName(newUser.get_DistinguishedName());
ap.set_AccessType(AccessType.ALLOW);
GroupSet groups = newUser.get_MemberOfGroups();
Iterator iter = groups.iterator();
while (iter.hasNext() == true)
{
Group group = (Group) iter.next();
// ユーザーが以下の 2 つのグループのいずれかに属しているかどうかに基づいて権限を設定。
if (group.get_DisplayName().equalsIgnoreCase("LoanReviewers") )
{
ap.set_AccessMask(LOAN_REVIEWER);
apl.add(ap);
break;
}
else if (group.get_DisplayName().equalsIgnoreCase("LoanCreators") )
{
ap.set_AccessMask(LOAN_CREATOR);
apl.add(ap);
break;
}
}
return apl;
}
C# の例
// 定数でアクセス権の組み合わせを指定。
private const int LOAN_CREATOR = (int)AccessRight.READ_ACL | (int)AccessRight.CHANGE_STATE | (int)AccessRight.CREATE_INSTANCE
| (int)AccessRight.VIEW_CONTENT | (int)AccessRight.MINOR_VERSION | (int)AccessRight.UNLINK
| (int)AccessRight.LINK | (int)AccessRight.WRITE | (int)AccessRight.READ;
private const int LOAN_REVIEWER = (int)AccessRight.VIEW_CONTENT |(int)AccessRight.READ_ACL | (int)AccessRight.READ
| (int)AccessRight.LINK;
// ドキュメントのアクセス権リストに新規ユーザーを追加。ユーザーの
// グループ・メンバーシップによって権限が決定される。
private IAccessPermissionList setPermissions(IAccessPermissionList apl, IUser newUser)
{
IAccessPermission ap = Factory.AccessPermission.CreateInstance();
ap.GranteeName = newUser.DistinguishedName;
ap.AccessType = AccessType.ALLOW;
IGroupSet groups = newUser.MemberOfGroups;
foreach (IGroup group in groups)
{
// ユーザーが以下の 2 つのグループのいずれかに属しているかどうかに基づいて権限を設定。
if (group.DisplayName.Equals("LoanReviewers", StringComparison.OrdinalIgnoreCase))
{
ap.AccessMask = LOAN_REVIEWER;
apl.Add(ap);
break;
}
else if (group.DisplayName.Equals("LoanCreators, StringComparison.OrdinalIgnoreCase))
{
ap.AccessMask = LOAN_CREATOR;
apl.Add(ap);
break;
}
}
return apl;
}
権限の変更
以下のコード例は、ドキュメントのクラスへのアクセス権限を持つ特定のグループの権限を変更する方法を示しています。LoanReviewers グループ内のユーザーは、Documents のサブクラスである Loans クラスのインスタンスのセキュリティーを表示する権限を持っています。セキュリティーを表示する権限は削除されます。
Java の例
private static final PropertyFilter PF;
static
{
PF= new PropertyFilter();
PF.addIncludeProperty(new FilterElement(null, null, null, "DefaultInstancePermissions", null));
}
// Gets Loans subclass.
ClassDefinition cd=Factory.ClassDefinition.fetchInstance(os, new Id("{3B71BC99-FD11-4E15-9CF5-83887ED1C42F}"), PF);
// Gets permissions from Loans subclass.
AccessPermissionList apl = cd.get_DefaultInstancePermissions();
apl = cd.get_Permissions();
// Iterates permissions in search of LoanReviewers group.
// Removes the access right for viewing security on Loans instances.
// Saves the modified permission for the LoanReviewers group.
Iterator iter = apl.iterator();
while (iter.hasNext())
{
AccessPermission ap = (AccessPermission)iter.next();
if (ap.get_GranteeName().equalsIgnoreCase("LOANREVIEWERS@process.auto.acme.com"))
{
int rights = ap.get_AccessMask();
rights &= ~AccessRight.READ_ACL.getValue();
ap.set_AccessMask(rights);
apl.add(ap);
cd.set_Permissions(apl);
cd.save(RefreshMode.REFRESH);
break;
}
}
C# の例
private static readonly PropertyFilter PF;
{
PF = new PropertyFilter();
PF.AddIncludeProperty(new FilterElement(null, null, null, PropertyNames.DEFAULT_INSTANCE_PERMISSIONS, null));
}
// Gets Loans subclass.
IClassDefinition cd = Factory.ClassDefinition.FetchInstance(os, new Id("{3B71BC99-FD11-4E15-9CF5-83887ED1C42F}"), PF);
// Gets permissions from Loans subclass.
IAccessPermissionList apl = cd.Permissions;
// Iterates permissions in search of LoanReviewers group.
// Removes the access right for viewing security on Loans instances.
// Saves the modified permission for the LoanReviewers group.
foreach (IAccessPermission ap in apl)
{
if (ap.GranteeName.Equals("LOANREVIEWERS@process.auto.acme.com", StringComparison.OrdinalIgnoreCase))
{
int rights = (int)ap.AccessMask;
rights &= ~(int)AccessRight.READ_ACL;
ap.AccessMask = rights;
apl.Add(ap);
cd.Permissions = apl;
cd.Save(RefreshMode.REFRESH);
break;
}
}
権限のチェック
以下のコード例は、特定の操作を実行するために Document オブジェクトに対するユーザーの権限をチェックする方法を示します。個々のアクセス権が権限のテストに使用されています。
Java の例
private static final PropertyFilter PF;
static
{
PF= new PropertyFilter();
PF.addIncludeProperty(new FilterElement(null, null, null, PropertyNames.ID, null));
}
private static final int ACCESS_REQUIRED = AccessRight.DELETE.getValue() | AccessRight.WRITE.getValue() | AccessRight.MAJOR_VERSION.getValue();
...
Document doc=Factory.Document.fetchInstance(os, new Id("{BBC0B2D5-9850-4F48-9AC9-7DBC38A9C89D}"), PF);
int accessMask = doc.getAccessAllowed();
// ユーザーはドキュメントに対して以下の権限を持っているか?
if ( (accessMask & ACCESS_REQUIRED) == ACCESS_REQUIRED)
{
// これらの権限に対する適切な操作を実行
}
C# の例
private static readonly PropertyFilter PF;
static checkPermissions()
{
PF = new PropertyFilter();
PF.AddIncludeProperty(new FilterElement(null, null, null, PropertyNames.ID, null));
}
private const int ACCESS_REQUIRED = (int)AccessRight.DELETE | (int)AccessRight.WRITE | (int)AccessRight.MAJOR_VERSION;
...
IDocument doc = Factory.Document.FetchInstance(os, new Id("{BBC0B2D5-9850-4F48-9AC9-7DBC38A9C89D}"), PF);
int accessMask = (int)doc.GetAccessAllowed();
// ユーザーは以下の権限を持っているか?
if ( (accessMask & ACCESS_REQUIRED) == ACCESS_REQUIRED)
{
// これらの権限に対する適切な操作を実行
}
アクセス権の記述の取得
以下の例は、権限を選択するためのユーザー・インターフェース (UI) を設定するためにアクセス権の記述 (APD) を取得する方法を示しています (UI コード、および権限を設定するためのコードは含まれていません)。このコードでは、Folder クラスの記述から APD のコレクションが作成され、次にそのコレクションを反復処理して、各 AccessPermissionDescription オブジェクトから説明情報を取得します。 コード例の下に出力リストも示します。
Java の例
String apdClass = ClassNames.FOLDER;
ClassDescription cd = Factory.ClassDescription.getInstance(os, apdClass);
cd.fetchProperty(PropertyNames.PERMISSION_DESCRIPTIONS, null);
AccessPermissionDescriptionList apdl = cd.get_PermissionDescriptions();
System.out.println(apdClass + " has this many APDs: " + apdl.size());
for (Iterator it = apdl.iterator(); it.hasNext();)
{
AccessPermissionDescription apd = (AccessPermissionDescription)it.next();
String dn = apd.get_DisplayName();
String dt = apd.get_DescriptiveText();
dt = (dn.equals(dt) ? "" : ": " + dt);
String pt = apd.get_PermissionType().toString();
pt += " ".substring(pt.length());
System.out.println(pt + " " + dn + dt);
}
C# の例
String apdClass = ClassNames.FOLDER ;
IClassDescription cd = Factory.ClassDescription.GetInstance(os, apdClass);
cd.FetchProperty(PropertyNames.PERMISSION_DESCRIPTIONS, null);
IAccessPermissionDescriptionList apdl = cd.PermissionDescriptions;
System.Console.WriteLine(apdClass + " has this many APDs: " + apdl.Count);
foreach (IAccessPermissionDescription apd in apdl)
{
String dn = apd.DisplayName;
String dt = apd.DescriptiveText;
dt = (dn.Equals(dt) ? "" : ": " + dt);
String pt = apd.PermissionType.ToString();
pt += " " .Substring(pt.Length);
System.Console.WriteLine(pt + " " + dn + dt);
}
出力リスト
Folder has this many APDs: 21
LEVEL Full Control
LEVEL Modify properties
LEVEL Add to Folder
LEVEL_DEFAULT View properties
RIGHT View all properties
RIGHT Modify all properties
RIGHT Reserved12 (Deploy is deprecated)
RIGHT Reserved13 (Archive is deprecated)
RIGHT File in folder / Annotate
RIGHT Unfile from folder
RIGHT Create instance
RIGHT Create subfolder
RIGHT Delete
RIGHT Read permissions
RIGHT Modify permissions
RIGHT Modify owner
RIGHT_INHERIT_ONLY Minor versioning
RIGHT_INHERIT_ONLY Major versioning
RIGHT_INHERIT_ONLY View content
RIGHT_INHERIT_ONLY Change state
RIGHT_INHERIT_ONLY Publish
Marking オブジェクトの操作
以下のコード例では、FileNet® P8 ドメインからすべての MarkingSet オブジェクトが取得されます。
Java の例
Domain domain = Factory.Domain.fetchInstance(conn, "Domain", null);
domain.get_MarkingSets();
Kerberos の実装
クライアントでのシングル・サインオン (SSO) 認証に Kerberos を実装できます。Kerberos の詳細については、Kerberos for Content Engine を参照してください。
前提条件
SSO 認証用に Kerberos を使用するには、多数の前提条件を満たす必要があります。
システムの前提条件
- Kerberos を使用して認証を実行できるのは、Windows クライアントに限られます。ただし、オペレーティング・システムに関係なく、どの Content Engine サーバーでも、Kerberos 認証情報を受け入れることは可能です。クライアントとサーバーの両方の Windows システムが、Windows 2000 (またはそれ以降の) オペレーティング・システム上で稼動している必要があります。
- Windows オペレーティング・システム、またはサポートされる Windows 以外のオペレーティング・システムが稼働する CEMP サーバーでは、ディレクトリー・サービス・プロバイダーとして Active Directory を使用する必要もあります。Windows Content Engine サーバーの場合、サーバーは、Active Directory ドメインのメンバーでなければなりません。
ドメイン/アカウントの前提条件
- Windows クライアント・システムは、(ワークグループではなく) ドメイン内に存在する必要があります。また、ユーザーはドメイン・アカウントとしてログインする必要があります (ローカル・アカウントとしてログインすることはできません)。
- Windows サーバー・システムも、(ワークグループではなく) ドメインのメンバーでなければなりませんが、ログイン・アカウントがドメイン内にあるか、ローカルであるかについての制限はありません。Windows 以外の Content Engine サーバーは、Active Directory へのアクセスのみが必要です。
- 「IBM FileNet P8 Security」マニュアルの『Cross-realm Kerberos authentication』セクションで説明するステップを実行していない場合は、クライアント・システムと Content Engine サーバー・システムが同じドメイン内に存在する必要があります (Windows 以外のサーバーの場合は、同じ Active Directory にアクセスする必要があります)。
スタンドアロン .NET クライアントの前提条件
- Content Engine .NET API または COM 互換レイヤー・クライアントの場合は、Microsoft .NET Framework 3.0 以降を組み込みの Windows Communication Foundation (WCF) サポートとともにインストールし、FileNet.Api.dll (COM 互換レイヤー・ソフトウェアに付属) への参照を設定する必要があります。
- .NET Web サービス・クライアントの場合は、.NET 1.1 および Microsoft Web Services Extensions (WSE) 2.0 をクライアント・システムにインストールする必要があります。
Content Engine Java サーバーの前提条件
- Java Runtime
Environment (JRE) 1.5.0 以上。Kerberos ユーティリティーを使用する場合は、Java Development Kit (JDK) 1.5.0 をインストールすることをお勧めします。必須ではありませんが、JDK の Java ツールを Windows システムで利用できるように JAVA_HOME 環境変数を設定することもできます。
次に例を示します。
- Windows: set JAVA_HOME=c:¥j2sdk1.5.0.11 %JAVA_HOME%¥bin¥ktab
- Windows 以外: JAVA_HOME=/opt/j2sdk1.5.0.11; export JAVA_HOME; ${JAVA_HOME}/bin/ktab
- Kerberos 構成ファイル (krb5.ini) を Java 仮想マシン (JVM) で使用できる必要があります。サンプル・ファイルが提供されており、Content Engine ソフトウェアのインストールの一環として、次の場所にインストールされます。<installation_directory>¥FileNet¥ContentEngine¥Kerberos¥krb5.ini または <installation_directory>/FileNet/ContentEngine/Kerberos/krb5.ini。 このファイルを環境に合わせて変更する手順については、Kerberos for Content Engine を参照してください。
- Windows 2000 SP4、Windows XP SP2、および Windows 2003 のセキュリティーに対して Microsoft が行った変更によって、システムのキャッシュ済みの Kerberos Ticket Granting Tickets (TGT) を統合ログイン用に使用する Java の機能に影響がありました。
以下のファイルを探してダブルクリックすると、パッチを適用してこの問題を訂正できます。
<installation_directory>:¥FileNet¥Content Engine¥Kerberos¥AllowTgtSessionKey_fix_for_Krb5LoginModule.reg
新しいセキュリティー機能を無効にする値を Windows システム・レジストリーに追加するために RegEdit が開始します。このレジストリー編集は、以前の Windows サービス・パックでも問題なく使用できます。
API クライアントでの Kerberos の使用
Kerberos 認証を Content Engine .NET API クライアントで使用する方法の例を以下に示します。
Java の例
// 現在、Java クライアントでは、Kerberos 認証はサポートされていません。
C# の例
KerberosCredentials creds = new KerberosCredentials();
ClientContext.SetThreadCredentials(creds);
IConnection conn = Factory.Connection.GetConnection(strURI);
IDomain domain = Factory.Domain.GetInstance(conn, strP8Domain);
C# の例では、Windows システムのログイン・ユーザーの ID が各 Content Engine コマンドで使用されています。
セキュリティー・ポリシーの操作
以下に挙げる Java および C# のコード例では、セキュリティー・ポリシーとセキュリティー・テンプレートの操作方法を示します。以下の例では、セキュリティー・ポリシーの作成および割り当ての方法を示します。別の例では、アプリケーション・セキュリティー・テンプレートをオブジェクトに適用する方法と、セキュリティー・テンプレートから権限情報を取得する方法を示します。最後の例では、オブジェクトおよびオブジェクト・ストアの両方からセキュリティー・ポリシーを除去する方法を示します。
セキュリティー・ポリシーの作成
以下の Java および C# の例では、 SecurityPolicy オブジェクトの作成方法を示します。最初に、3 つの SecurityTemplate オブジェクトを作成して、SecurityTemplateList オブジェクトに追加します。これらのテンプレートのうちの 2 つは、タイプ VersioningSecurityTemplate であり、1 つはタイプ ApplicationSecurityTemplate です。VersioningSecurityTemplate オブジェクトは、リリース済みおよび置換済みバージョンのオブジェクトに自動的に適用されるようになっています。ApplicationSecurityTemplate オブジェクトは、手動でオブジェクトに適用する必要があります (「ApplicationSecurityTemplate の適用」を参照してください)。各テンプレートでは、TemplatePermissions プロパティーに AccessPermissionList オブジェクトが設定されています。これは、setPermissions メソッド (示されません) によって戻されます。
次に、SecurityPolicy オブジェクトを作成して、その SecurityTemplates プロパティーに SecurityTemplateList を設定します。セキュリティー・ポリシーの PreserveDirectPermissions プロパティーに false が設定されたことに注意してください。その結果、セキュリティー・ポリシーをオブジェクトに割り当てると、オブジェクトの元の直接権限が、セキュリティー・ポリシーのテンプレートに定義された権限で置換されます。
Java の例
public void createSecurityObject(ObjectStore os)
{
// Access rights for released, superseded, and obsolete objects
int permReleased = AccessRight.READ_ACL_AS_INT | AccessRight.CHANGE_STATE_AS_INT
| AccessRight.CREATE_INSTANCE_AS_INT | AccessRight.VIEW_CONTENT_AS_INT
| AccessRight.MINOR_VERSION_AS_INT | AccessRight.UNLINK_AS_INT
| AccessRight.LINK_AS_INT | AccessRight.MAJOR_VERSION_AS_INT
| AccessRight.WRITE_AS_INT | AccessRight.READ_AS_INT;
int permSuperseded = AccessRight.READ_ACL_AS_INT | AccessRight.VIEW_CONTENT_AS_INT
| AccessRight.READ_AS_INT;
int permObsolete = AccessRight.READ_ACL_AS_INT | AccessRight.READ_AS_INT
| AccessRight.DELETE_AS_INT;
// セキュリティー・テンプレートを作成する
VersioningSecurityTemplate vst1 = Factory.VersioningSecurityTemplate.createInstance(os);
VersioningSecurityTemplate vst2 = Factory.VersioningSecurityTemplate.createInstance(os);
ApplicationSecurityTemplate vst3 = Factory.ApplicationSecurityTemplate.createInstance(os);
SecurityTemplateList stl = Factory.SecurityTemplate.createList();
vst1.set_ApplyStateID(VersionStatusId.RELEASED);
vst1.set_TemplatePermissions( setPermissions("#AUTHENTICATED-USERS", permReleased) );
vst1.set_DisplayName("Version Template for Released Object");
vst1.set_IsEnabled(Boolean.TRUE);
stl.add(vst1);
vst2.set_ApplyStateID(VersionStatusId.SUPERSEDED);
vst2.set_TemplatePermissions( setPermissions("#AUTHENTICATED-USERS", permSuperseded) );
vst2.set_DisplayName("Version Template for Superseded Object");
vst2.set_IsEnabled(Boolean.TRUE);
stl.add(vst2);
vst3.set_ApplyStateID(new Id("{21a47705-d20a-4b65-938e-2ddcefa45927}") );
vst3.set_TemplatePermissions( setPermissions("#AUTHENTICATED-USERS", permObsolete) );
vst3.set_DisplayName("Application Template for Obsolete Objects");
vst3.set_IsEnabled(Boolean.TRUE);
stl.add(vst3);
// セキュリティー・ポリシーを作成する
SecurityPolicy sp = Factory.SecurityPolicy.createInstance(os, ClassNames.SECURITY_POLICY);
sp.set_SecurityTemplates(stl);
sp.set_DisplayName("Security Policy with Version and Application Templates");
sp.set_PreserveDirectPermissions(Boolean.FALSE);
sp.save(RefreshMode.REFRESH);
}
C# の例
public void createSecurityObject(IObjectStore os)
{
// Access rights for released, superseded, and obsolete objects
int permReleased = (int)AccessRight.READ_ACL | (int)AccessRight.CHANGE_STATE
| (int)AccessRight.CREATE_INSTANCE | (int)AccessRight.VIEW_CONTENT
| (int)AccessRight.MINOR_VERSION | (int)AccessRight.UNLINK
| (int)AccessRight.LINK | (int)AccessRight.MAJOR_VERSION
| (int)AccessRight.WRITE | (int)AccessRight.READ;
int permSuperseded = (int)AccessRight.READ_ACL | (int)AccessRight.VIEW_CONTENT
| (int)AccessRight.READ;
int permObsolete = (int)AccessRight.READ_ACL| (int)AccessRight.READ
| (int)AccessRight.DELETE;
// セキュリティー・テンプレートを作成する
IVersioningSecurityTemplate vst1 = Factory.VersioningSecurityTemplate.CreateInstance(os);
IVersioningSecurityTemplate vst2 = Factory.VersioningSecurityTemplate.CreateInstance(os);
IApplicationSecurityTemplate vst3 = Factory.ApplicationSecurityTemplate.CreateInstance(os);
ISecurityTemplateList stl = Factory.SecurityTemplate.CreateList();
vst1.ApplyStateID = VersionStatusId.RELEASED;
vst1.TemplatePermissions = setPermissions("#AUTHENTICATED-USERS", permReleased);
vst1.DisplayName = "Version Template for Released Object";
vst1.IsEnabled = true;
stl.Add(vst1);
vst2.ApplyStateID = VersionStatusId.SUPERSEDED;
vst2.TemplatePermissions = setPermissions("#AUTHENTICATED-USERS", permSuperseded);
vst2.DisplayName = "Version Template for Superseded Object";
vst2.IsEnabled = true;
stl.Add(vst2);
vst3.ApplyStateID = new Id("{21a47705-d20a-4b65-938e-2ddcefa45927}");
vst3.TemplatePermissions = setPermissions("#AUTHENTICATED-USERS", permObsolete);
vst3.DisplayName = "Application Template for Obsolete Objects";
vst3.IsEnabled = true;
stl.Add(vst3);
// セキュリティー・ポリシーを作成する
ISecurityPolicy sp = Factory.SecurityPolicy.CreateInstance(os, ClassNames.SECURITY_POLICY);
sp.SecurityTemplates = stl;
sp.DisplayName = "Security Policy with Version and Application Templates";
sp.PreserveDirectPermissions = false;
sp.Save(RefreshMode.REFRESH);
}
セキュリティー・ポリシーの割り当て
以下の Java および C# の例では、セキュリティー・ポリシーをクラスに割り当てる方法を示します。ClassDefinition と SecurityPolicy の Id オブジェクトをメソッドに渡して、ClassDefinition および SecurityPolicy オブジェクトを作成します。コードでは、ヘルパー・メソッド getPropertyDefinition (示されません) を使用して SecurityPolicy 用のクラスの PropertyDefinition オブジェクトを取得した後、それに SecurityPolicy オブジェクトを設定しています。
セキュリティー・ポリシーは、クラスの既存のオブジェクト・インスタンスではなく、クラスの新しいオブジェクト・インスタンスに自動的に適用されることに注意してください。クラスの既存のオブジェクト・インスタンスのセキュリティー・ポリシーは、明示的に設定する必要があります。
Java の例
public void assignSecurityPolicy(ObjectStore os, Id classId, Id securityPolicyId)
{
ClassDefinition cd = Factory.ClassDefinition.fetchInstance(os, classId, null);
SecurityPolicy sp = Factory.SecurityPolicy.getInstance(os, ClassNames.SECURITY_POLICY, securityPolicyId);
PropertyDefinition pd = getPropertyDefinition(cd.get_PropertyDefinitions(), ClassNames.SECURITY_POLICY);
(pd.getProperties().get(PropertyNames.PROPERTY_DEFAULT_OBJECT)).setObjectValue(sp);
cd.save(RefreshMode.REFRESH);
}
C# の例
public void assignSecurityPolicy(IObjectStore os, Id classId, Id securityPolicyId)
{
IClassDefinition cd = Factory.ClassDefinition.FetchInstance(os, classId, null);
ISecurityPolicy sp = Factory.SecurityPolicy.GetInstance(os, ClassNames.SECURITY_POLICY, securityPolicyId);
IPropertyDefinition pd = getPropertyDefinition(cd.PropertyDefinitions, ClassNames.SECURITY_POLICY);
(pd.Properties.GetProperty(PropertyNames.PROPERTY_DEFAULT_OBJECT)).SetObjectValue(sp);
cd.Save(RefreshMode.REFRESH);
}
アプリケーション・セキュリティー・テンプレートの適用
以下の Java および C# の例では、ApplicationSecurityTemplate をオブジェクトに適用する方法を示します。以下の例では、Folder オブジェクトを反復処理して、1 年以上変更されていないドキュメントをすべてフィルタリングします。条件を満たしたドキュメントについては、削除権限を備えたアプリケーション・セキュリティー・テンプレートが適用されます。この例では、削除権限を備えたアプリケーション・セキュリティー・テンプレートを含む SecurityPolicy が、フォルダー内のドキュメントに既に割り当てられたものと想定しています。
Java の例
public void applyApplicationSecurityTemplate(ObjectStore os, Id folderId)
{
// Create a folder object.
Folder folder = Factory.Folder.fetchInstance(os, folderId, null);
// フォルダー内のドキュメントをすべて取得します
DocumentSet ds = folder.get_ContainedDocuments();
// Get current date to compare against dates of documents.
Calendar cal = new GregorianCalendar();
int currYear = cal.get(Calendar.YEAR);
int currMonth = cal.get(Calendar.MONTH);
// フォルダーのドキュメントを繰り返し、最終変更日を確認します。
// 1 年を超えていた場合は、削除権限を備えた ApplicationSecurityTemplate を適用します。
Iterator iter = ds.iterator();
while (iter.hasNext())
{
Document doc = (Document) iter.next();
Date docDate = doc.get_DateLastModified();
cal.setTime(docDate);
if (cal.get(Calendar.YEAR) < currYear && cal.get(Calendar.MONTH) < currMonth )
{
doc.applySecurityTemplate(new Id("{21a47705-d20a-4b65-938e-2ddcefa45927}") );
doc.save(RefreshMode.REFRESH);
}
}
}
C# の例
public void applyApplicationSecurityTemplate(IObjectStore os, Id folderId)
{
// Create a folder object.
IFolder folder = Factory.Folder.FetchInstance(os, folderId, null);
// フォルダー内のドキュメントをすべて取得します
IDocumentSet ds = folder.ContainedDocuments;
// Get current date to compare against dates of documents.
int currYear = DateTime.Now.Year;
int currMonth = DateTime.Now.Month;
// フォルダーのドキュメントを繰り返し、最終変更日を確認します。
// 1 年を超えていた場合は、削除権限を備えた ApplicationSecurityTemplate を適用します。
System.Collections.IEnumerator iter = ds.GetEnumerator();
while (iter.MoveNext())
{
IDocument doc = (IDocument) iter.Current;
DateTime docDate = (DateTime) doc.DateLastModified;
if (docDate.Year < currYear+1 && docDate.Month < currMonth+1)
{
doc.ApplySecurityTemplate(new Id("{21a47705-d20a-4b65-938e-2ddcefa45927}") );
doc.Save(RefreshMode.REFRESH);
}
}
}
セキュリティー・テンプレート情報の取得
セキュリティー・テンプレートから権限の説明を取得することが可能です。SecurityTemplate オブジェクトには、TemplatePermissionDescriptions プロパティーが含まれています。これには、 AccessPermissionDescription オブジェクトのリストが含まれており、このオブジェクトから、アクセス権に関する情報を取得できます。
以下の Java および C# の例では、メソッドに渡される SecurityPolicy オブジェクト内のすべての SecurityTemplate オブジェクトについて、その権限の説明を取得します。セキュリティー・テンプレートのリスト (SecurityTemplateList) を反復処理して、メソッドは、セキュリティー・テンプレートから TemplatePermissionDescriptions プロパティーを取得します。次に、AccessPermissionDescriptionList を反復処理して、各 AccessPermissionDescription オブジェクトから情報を出力します。
Java の例
public void getSecurityTemplateInformation(ObjectStore os, Id secPolicyId)
{
SecurityPolicy sp = Factory.SecurityPolicy.fetchInstance(os, secPolicyId, null );
SecurityTemplateList stl = sp.get_SecurityTemplates();
Iterator outerIter = stl.iterator();
while (outerIter.hasNext())
{
SecurityTemplate st = (SecurityTemplate) outerIter.next();
AccessPermissionDescriptionList apdl = st.get_TemplatePermissionDescriptions();
Iterator innerIter = apdl.iterator();
System.out.println("Security template is " + st.get_DisplayName());
while (innerIter.hasNext())
{
AccessPermissionDescription apd = (AccessPermissionDescription) innerIter.next();
System.out.println("Permission is " + apd.get_DescriptiveText() + "¥n" +
"Permission type is " + apd.get_PermissionType().toString() + "¥n" +
"Access mask is " + apd.get_AccessMask()
);
}
System.out.println("=============================¥n");
}
}
C# の例
public void getSecurityTemplateInformation(IObjectStore os, Id secPolicyId)
{
ISecurityPolicy sp = Factory.SecurityPolicy.FetchInstance(os, secPolicyId, null);
ISecurityTemplateList stl = sp.SecurityTemplates;
System.Collections.IEnumerator outerIter = stl.GetEnumerator();
while (outerIter.MoveNext())
{
ISecurityTemplate st = (ISecurityTemplate) outerIter.Current;
IAccessPermissionDescriptionList apdl = st.TemplatePermissionDescriptions;
System.Collections.IEnumerator innerIter = apdl.GetEnumerator();
System.Console.WriteLine("Security template is " + st.DisplayName);
while (innerIter.MoveNext())
{
IAccessPermissionDescription apd = (IAccessPermissionDescription) innerIter.Current;
System.Console.WriteLine("Permission is " + apd.DescriptiveText + "¥n" +
"Permission type is " + apd.PermissionType.ToString() + "¥n" +
"Access mask is " + apd.AccessMask
);
}
System.Console.WriteLine("=============================¥n");
}
}
セキュリティー・ポリシーの除去
オブジェクトからセキュリティー・ポリシーを除去するには、オブジェクトの SecurityPolicy プロパティーに null を設定します。オブジェクトがクラスの場合は、SecurityPolicy のクラスの PropertyDefinition オブジェクトに null を設定します。オブジェクト・ストアからセキュリティー・ポリシーを除去することもできます (オブジェクトがそれに対する参照を保持していない場合)。
以下の Java および C# の例では、最初にクラスからセキュリティー・ポリシーを除去する方法を示し、次にオブジェクト・ストアからセキュリティー・ポリシーを削除する方法を示します。セキュリティー・ポリシーは、クラスから除去しても、そのクラスに基づくオブジェクトからは除去されないことに注意してください。オブジェクト・ストアからセキュリティー・ポリシーを削除する前に、それに対する参照を保持するすべてのオブジェクトからセキュリティー・ポリシーを明示的に除去する必要があります。
Java の例
public void removeSecurityObject(Id classId, ObjectStore os)
{
// Get the class from which the security object will be removed.
ClassDefinition cd = Factory.ClassDefinition.fetchInstance(os, classId, null);
// SecurityPolicy のプロパティー定義を取得します。
// ヘルパー・メソッド getPropertyDefinition は、示されません。
PropertyDefinition pd = getPropertyDefinition(cd.get_PropertyDefinitions(), ClassNames.SECURITY_POLICY);
// 除去する SecurityObject の Id を取得します。
SecurityPolicy spTarget = (SecurityPolicy) (pd.getProperties().get(PropertyNames.PROPERTY_DEFAULT_OBJECT)).getObjectValue();
Id spTargetId = spTarget.get_Id();
// クラスから SecurityObject を除去します。
(pd.getProperties().get(PropertyNames.PROPERTY_DEFAULT_OBJECT)).setObjectValue(null);
cd.save(RefreshMode.REFRESH);
// オブジェクト・ストアから SecurityObject を削除します。
SecurityPolicySet sps = os.get_SecurityPolicies();
Iterator outerIter = sps.iterator();
while (outerIter.hasNext())
{
SecurityPolicy sp = (SecurityPolicy) outerIter.next();
if (sp.get_Id().equals(spTargetId) )
{
sp.delete();
sp.save(RefreshMode.REFRESH);
}
}
}
C# の例
public void removeSecurityObject(Id classId, IObjectStore os)
{
// Get the class from which the security object will be removed.
IClassDefinition cd = Factory.ClassDefinition.FetchInstance(os, classId, null);
// SecurityPolicy のプロパティー定義を取得します。
// ヘルパー・メソッド getPropertyDefinition は、示されません。
IPropertyDefinition pd = getPropertyDefinition(cd.PropertyDefinitions, ClassNames.SECURITY_POLICY);
// 除去する SecurityObject の Id を取得します。
ISecurityPolicy spTarget = (ISecurityPolicy)(pd.Properties.GetProperty(PropertyNames.PROPERTY_DEFAULT_OBJECT)).GetObjectValue();
Id spTargetId = spTarget.Id;
// クラスから SecurityObject を除去します。
(pd.Properties.GetProperty(PropertyNames.PROPERTY_DEFAULT_OBJECT)).SetObjectValue(null);
cd.Save(RefreshMode.REFRESH);
// オブジェクト・ストアから SecurityObject を削除します。
ISecurityPolicySet sps = os.SecurityPolicies;
System.Collections.IEnumerator outerIter = sps.GetEnumerator();
while (outerIter.MoveNext())
{
ISecurityPolicy sp = (ISecurityPolicy)outerIter.Current;
if (sp.Id.Equals(spTargetId))
{
sp.Delete();
sp.Save(RefreshMode.REFRESH);
}
}
}