JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

EJB3.1入門〜セキュリティ〜

JavaEEではユーザーの認証、認証されたユーザーがどのようなロールを認可されるかという設定は全てサーバーが管理する。
そのため、EJBのセキュリティ設定は、使用可能なロールの設定と、そのロールに対して、どのEJBやメソッドにアクセス許可を与えるかを設定するだけ。
使用可能なロールの設定はejb-jar.xmlに設定する。
主に使用するアノテーションは@PermitAll、@RolesAllowed、@DenyAll。どれもクラス・メソッドの両方に付加できる。
@RunAsアノテーションは、一時的にロールを切り替えるアノテーション

@Stateless

//このEJBにアクセスできるのはロールが"user","admin","employee"の場合のみ。
@RolesAllowed({"user","admin","employee"})
public class MogaEjb{


    // 全てのロールがアクセス可能なメソッド。
    // しかしBeanへのアクセスは@RolesAllowedで指定されたロールのみなので実質アクセスできるロールは"user","admin","employee"のみ。
    @PermitAll
    public boolean methodA(){
    }

    // 全てのロールに対してアクセスを拒否。
    @DenyAll
    public void methodB(){
    }
    
    // "admin"ロールのみが実行可能なメソッド。
    @RolesAllowed("admin")
    public boolean methodC(){
    }
}

@RolesAllowed({"officer","boss","ceo"})
// "officer","boss","ceo" を一時的に"admin"ロールを割り振り、アクセス許可を与える。
@RunAs("admin")
public class OtherEjb{
    
    @EJB
    @MogaEjb mogaEjb;

    
    public void methocXXX(){
        mogaEjb.methodC();//@RunAsで"admin"ロールが割り当てられるのでアクセスできる。
    }

}

@DeclareRoles 新規にロールを作る。
使用可能なロールの設定はejb-jar.xmlにまとめたほうが判りやすく、記述も楽なので使わない。


より細かくアクセス設定をしたい場合は、SessionContext.isCallerInRole() で保持しているロールを確認したり、SessionContext.getCallerPrincipal()から取得できるプリンシパル情報を利用する。