如何以编程方式在OpenEJB中指定我的用户/角色?

Val*_*her 3 java jaas openejb

在我正在开发的项目中,我们使用OpenEJB作为测试EJB的框架.我们以InitialContext编程方式构造,并使用它来获取事务管理器和各种EJB.

但是,我现在必须测试的EJB有@RolesAllowed注释,因此OpenEJB拒绝获取该EJB,认为我没有所需的权限.

如何向OpenEJB指定此测试应该模拟的用户,以及与他相关的角色?

Dav*_*ins 5

@RunAsbkail提到的建议无疑是一个很好的路要走.不涉及内部类的第二种方法是登录测试用例.

登录方式

引导OpenEJB时,请在InitialContext属性中指定user/pass,如下所示:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可能再次作为不同的用户进行测试:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试用户和组

您可以通过将a users.propertiesgroups.properties文件放在测试用例的类路径中来配置测试用户和组.在maven中,它位于以下位置:

  • SRC /测试/资源/ users.properties
  • SRC /测试/资源/ groups.properties

users.properties文件可能如下所示

joe=cool
jane=waterfall
Run Code Online (Sandbox Code Playgroud)

groups.properties像这样

Manager=jane
Employee=jane,joe
Run Code Online (Sandbox Code Playgroud)