我的业务类受EJB3安全注释的保护,现在我想从Spring控制器调用这些方法,我该怎么做?
编辑我将添加一些有关我的设置的信息,我使用Tomcat作为webcontainer,使用OpenEJB将EJB嵌入到tomcat中。我没有选择任何版本的弹簧,所以它或多或少地接受建议。
编辑当前设置以这种方式工作:
我有一个登录表单+控制器,在SessionContext中放置一个User
pojo。每次有人访问网站的安全部分时,应用程序都会检查用户pojo,如果有检查角色然后显示页面,是否显示相应的消息或重定向到登录页面。现在,由于User
内部的调用方法绕过了一个可能的安全上下文,这是一个在openejb安全示例中找到的此代码的 remix ,因此进行商务调用:
Caller managerBean = (Caller) context.lookup("ManagerBeanLocal");
managerBean.call(new Callable() {
public Object call() throws Exception {
Movies movies = (Movies) context.lookup("MoviesLocal");
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());
return null;
}
});
答案 0 :(得分:0)
Spring控制器(或任何与此有关的servlet容器组件),具有或不具有弹出安全性,可以使用EJB容器进行无缝身份验证,具体取决于您配置servlet容器的方式。您必须检查servlet容器的文档,了解如何配置安全上下文传播或在运行模式下使用EJB容器建立信任级别。
请添加配置的更多详细信息(EJB和servlet容器,版本,无论它们是否位于同一位置,身份验证发生的位置等),以便我们提供更多详细信息。
编辑2月20日。安全上下文传播
假设您使用no-args构造函数获取上下文:
InitialContext context = new InitialContext();
您可以确定OpenEJB的安全传播。无需其他配置。一旦使用上下文查找bean,安全上下文(用户和角色)就会传递给EJB容器。
所以你必须只关注tomcat中的安全性。我还没有理解你是如何配置tomcat的。你能在tomcat中显示更多的用户,角色,领域等配置吗?
编辑2月20日。测试tomcat
请参阅How to get user roles in a JSP / Servlet并首先在JSP / Servlet中进行测试,以确保正确获取用户主体和角色。传递此测试后,您可以测试带安全注释的EJB方法以验证安全传播。