在我正在開發的項目中,我們使用OpenEJB作爲測試EJB的框架。我們以編程方式構建InitialContext
,並使用它來獲取事務管理器和各種EJB。如何以編程方式在OpenEJB中指定我的用戶/角色?
但是,我現在必須測試的EJB有@RolesAllowed
註釋,因此OpenEJB拒絕獲取該EJB,認爲我沒有所需的權限。
我該如何指定OpenEJB這個測試應該模擬的用戶以及與他相關的角色?
在我正在開發的項目中,我們使用OpenEJB作爲測試EJB的框架。我們以編程方式構建InitialContext
,並使用它來獲取事務管理器和各種EJB。如何以編程方式在OpenEJB中指定我的用戶/角色?
但是,我現在必須測試的EJB有@RolesAllowed
註釋,因此OpenEJB拒絕獲取該EJB,認爲我沒有所需的權限。
我該如何指定OpenEJB這個測試應該模擬的用戶以及與他相關的角色?
@RunAs
建議bkail提及絕對是一個好方法。不涉及內部類的第二種方法是在測試用例中登錄。
當你引導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();
}
}
您可以配置t通過將users.properties
和groups.properties
文件放入測試用例的類路徑中,來確定用戶和組。在行家認爲會是在以下位置:
的users.properties
文件可能看起來像這
joe=cool
jane=waterfall
而且groups.properties
像這樣
Manager=jane
Employee=jane,joe
查看OpenEJB Testing Security Example。基本上,您通過一個沒有@RolesAllowed的測試bean進行間接調用,但在調用第二個bean之前使用@RunAs來切換角色。
我會嘗試這些例子爲好,但@大衛的回答,以測試在同一個測試的權威性機制似乎挺有意思的。我會upvote你的答案:) –
好吧,謝謝。大衛的答案涵蓋了程序化登錄,這是你的問題,所以選擇他是有道理的。 –
因此,創建LocalInitialContextFactory建立一個線程安全上下文,關閉它會結束它?有趣。好吧,我想它屬於OpenEJB示例頁面;-)。 –
看起來像個好主意。我會嘗試在工作中,並給你的賞金,如果它解決了我的問題:) –
完美的工作,非常感謝! –