15.6.5. エンティティをセキュアにする


Seam Security ではエンティティに対して特定の操作 (読み込む、 挿入、 更新、 削除) にセキュリティ制約を適用することもできます。
エンティティクラスのすべてのアクションをセキュアにするためには、下のようにクラスに @Restrict アノテーションを付与します。
@Entity
@Name("customer")
@Restrict
public class Customer {
  ...
}
Copy to Clipboard Toggle word wrap
@Restrict アノテーションに式が指定されていない場合、 デフォルトの操作は entity:action のパーミッションチェックとなります。 パーミッションの対象はエンティティのインスタンスで、 actionreadinsertupdatedelete のいずれかになります。
また、以下のとおり関連するエンティティのライフサイクルメソッドに @Restrict アノテーションを付与して特定の操作を制約することもできます。
  • @PostLoad − エンティティのインスタンスがデータベースからロードされた後に呼び出されます。 このメソッドは read パーミッションの設定に使用します。
  • @PrePersist − エンティティの新しいインスタンスが挿入される前に呼び出されます。 このメソッドは insert パーミッションの設定に使用します。
  • @PreUpdate − エンティティが更新される前に呼び出されます。 このメソッドは update パーミッションの設定に使用します。
  • @PreRemove − エンティティが削除される前に呼び出されます。 このメソッドは delete パーミッションの設定に使用します。
insert の動作に対してセキュリティチェックを行うようエンティティを設定する方法を以下の例に示します。 メソッドは何も操作を行う必要はなく、重要なのはアノテーションが正しく付与されていることです。
@PrePersist 
@Restrict 
public void prePersist() {}
Copy to Clipboard Toggle word wrap

注記

/META-INF/orm.xml にコールバックメソッドを指定することもできます。
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
          http://java.sun.com/xml/ns/persistence/orm 
          http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
          version="1.0">

  <entity class="Customer">
    <pre-persist method-name="prePersist" />
  </entity>

</entity-mappings>
Copy to Clipboard Toggle word wrap
この場合も CustomerprePersist() メソッドに @Restrict アノテーションを付与する必要があります。
次の設定は Seamspace サンプルをベースとしています。 認証済みユーザーが新しい MemberBlog 記録を挿入できるパーミッションを持っているかどうかを確認します。 チェックが行われるエンティティはワーキングメモリに自動的に挿入されます (この例の場合は MemberBlog)。
rule InsertMemberBlog
  no-loop
  activation-group "permissions"
when
  principal: Principal()
  memberBlog: MemberBlog(member : member -> 
                        (member.getUsername().equals(principal.getName())))
  check: PermissionCheck(target == memberBlog, 
                         action == "insert", granted == false)
then
  check.grant();
end;
Copy to Clipboard Toggle word wrap
このルールは、 現在認証済みのユーザー名 (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 ファイルでこのリスナーをインストールします。
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="
                   http://java.sun.com/xml/ns/persistence/orm 
                   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">

  <persistence-unit-metadata>
    <persistence-unit-defaults>
      <entity-listeners>
        <entity-listener 
                class="org.jboss.seam.security.EntitySecurityListener"/>
      </entity-listeners>
    </persistence-unit-defaults>
  </persistence-unit-metadata>

</entity-mappings>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat