4

私が取り組んでいるプロジェクトでは、EJBをテストするためのフレームワークとしてOpenEJBを使用しています。プログラムで構築し、InitialContextそれを使用してトランザクションマネージャーとさまざまなEJBを取得します。

ただし、テストする必要のあるEJBには@RolesAllowedアノテーションが付いているため、OpenEJBはそのEJBの取得を拒否し、必要な権限がないと主張します。

このテストがシミュレートすることになっているユーザーと、彼に関連付けられている役割をOpenEJBに指定するにはどうすればよいですか?

4

2 に答える 2

6

@RunAsbkailが言及している提案は、間違いなく良い方法です。内部クラスを含まない2番目のアプローチは、テストケースにログインすることです。

ログインアプローチ

OpenEJBをブートストラップするときは、InitialContext次のようにプロパティでユーザー/パスを指定します。

public void testAsManager() throws Exception {
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    p.put(Context.SECURITY_PRINCIPAL, "jane");
    p.put(Context.SECURITY_CREDENTIALS, "waterfall");

    InitialContext context = new InitialContext(p);

    try {
        movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
        movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
        movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998));

        List<Movie> list = movies.getMovies();
        assertEquals("List.size()", 3, list.size());

        for (Movie movie : list) {
            movies.deleteMovie(movie);
        }

        assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
    } finally {
        context.close();
    }
}

次に、別のユーザーとしてもう一度テストします。

public void testAsEmployee() throws Exception {
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    p.put(Context.SECURITY_PRINCIPAL, "joe");
    p.put(Context.SECURITY_CREDENTIALS, "cool");

    InitialContext context = new InitialContext(p);

    try {
        movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
        movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
        movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998));

        List<Movie> list = movies.getMovies();
        assertEquals("List.size()", 3, list.size());

        for (Movie movie : list) {
            try {
                movies.deleteMovie(movie);
                fail("Employees should not be allowed to delete");
            } catch (EJBAccessException e) {
                // Good, Employees cannot delete things
            }
        }

        // The list should still be three movies long
        assertEquals("Movies.getMovies()", 3, movies.getMovies().size());
    } finally {
        context.close();
    }
}

ユーザーとグループをテストする

テストケースのクラスパスにファイルをusers.properties配置することで、テストユーザーとグループを構成できます。groups.propertiesMavenでは、次の場所にあります。

  • src / test / resources / users.properties
  • src / test / resources / groups.properties

ファイルは次のusers.propertiesようになります

joe=cool
jane=waterfall

そしてgroups.propertiesそのように

Manager=jane
Employee=jane,joe
于 2011-10-08T22:41:24.443 に答える
1

OpenEJBテストのセキュリティ例を参照してください。基本的に、@ RolesAllowedを持たないテストBeanを介して間接的に実行しますが、2番目のBeanを呼び出す前に@RunAsを使用してロールを切り替えます。

于 2011-10-08T15:00:43.890 に答える