15.6.5. エンティティをセキュアにする
Seam Security ではエンティティに対して特定の操作 (読み込む、 挿入、 更新、 削除) にセキュリティ制約を適用することもできます。
エンティティクラスのすべてのアクションをセキュアにするためには、下のようにクラスに
@Restrict アノテーションを付与します。
@Restrict アノテーションに式が指定されていない場合、 デフォルトの操作は entity:action のパーミッションチェックとなります。 パーミッションの対象はエンティティのインスタンスで、 action は read、 insert、 update、 delete のいずれかになります。
また、以下のとおり関連するエンティティのライフサイクルメソッドに
@Restrict アノテーションを付与して特定の操作を制約することもできます。
@PostLoad− エンティティのインスタンスがデータベースからロードされた後に呼び出されます。 このメソッドはreadパーミッションの設定に使用します。@PrePersist− エンティティの新しいインスタンスが挿入される前に呼び出されます。 このメソッドはinsertパーミッションの設定に使用します。@PreUpdate− エンティティが更新される前に呼び出されます。 このメソッドはupdateパーミッションの設定に使用します。@PreRemove− エンティティが削除される前に呼び出されます。 このメソッドはdeleteパーミッションの設定に使用します。
insert の動作に対してセキュリティチェックを行うようエンティティを設定する方法を以下の例に示します。 メソッドは何も操作を行う必要はなく、重要なのはアノテーションが正しく付与されていることです。
@PrePersist
@Restrict
public void prePersist() {}
@PrePersist
@Restrict
public void prePersist() {}
注記
/META-INF/orm.xml にコールバックメソッドを指定することもできます。
この場合も
Customer の prePersist() メソッドに @Restrict アノテーションを付与する必要があります。
次の設定は Seamspace サンプルをベースとしています。 認証済みユーザーが新しい
MemberBlog 記録を挿入できるパーミッションを持っているかどうかを確認します。 チェックが行われるエンティティはワーキングメモリに自動的に挿入されます (この例の場合は MemberBlog)。
このルールは、 現在認証済みのユーザー名 (
Principal ファクトで示される) がブログのエントリを作成したメンバーの名前と一致すると memberBlog:insert パーミッションを付与します。 principal: Principal() の構造は変数のバインディングです。 認証中にワーキングメモリに配置された Principal オブジェクトのインスタンスをバインドし、 それを principal という変数に割り当てます。 変数のバインディングにより、 次の行のような他の場所で変数の参照が可能になり、 メンバーの名前を Principal の名前と比較します。 詳細は JBoss Rules のドキュメントを参照してください。
最後に、使用する JPA プロバイダを Seam Security と統合するためにリスナークラスをインストールします。
15.6.5.1. JPA でのエンティティセキュリティ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
EJB3 エンティティ Bean のセキュリティチェックは
EntityListener を使って行われます。 次の META-INF/orm.xml ファイルでこのリスナーをインストールします。