0

我的业务类受 EJB3 安全注释保护,现在我想从 Spring 控制器调用这些方法,我该怎么做?

编辑我将添加一些关于我的设置的信息,我使用 Tomcat 作为 webcontainer,使用 OpenEJB 将 EJB 嵌入到 tomcat 中。我没有选择任何版本的 spring 所以它或多或少地接受建议。

编辑当前设置以这种方式工作:我有一个登录表单+控制器,它User在 SessionContext 中放置了一个 pojo。每次有人访问站点的安全部分时,应用程序都会检查用户 pojo,如果它在那里检查角色然后显示页面,如果它没有显示适当的消息或重定向到登录页面。现在,业务调用是通过调用方法进行的,User该方法绕过了可能的安全上下文,该上下文是openejb 安全示例中的此代码的混音:

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;
    }
});
4

1 回答 1

0

Spring 控制器(或任何 servlet 容器组件),无论是否带有 spring-security,都可以根据您配置 servlet 容器的方式使用 EJB 容器进行无缝身份验证。您必须查看 servlet 容器的文档,了解如何配置安全上下文传播或在运行方式模式下与 EJB 容器建立信任级别。

请添加您的配置的更多详细信息(EJB 和 servlet 容器、版本、它们是否位于同一位置、发生身份验证的位置等),以使我们能够提供更多详细信息。

编辑 2 月 20 日。安全上下文传播

假设您使用无参数构造函数获取上下文:
InitialContext context = new InitialContext();

您可以确定向 OpenEJB 的安全传播。无需其他配置。只要您使用上下文查找 bean,安全上下文(用户和角色)就会传递给 EJB 容器。

所以你必须只关注tomcat的安全性。我还没有明白你是如何配置tomcat的。你能在tomcat中显示更多用户、角色、领域等的配置吗?

2月20日编辑。在tomcat上测试

请参阅如何在 JSP/Servlet 中获取用户角色并首先在 JSP/Servlet 中进行测试,以确保您正确获取用户主体和角色。通过此测试后,您可以测试带安全注释的 EJB 方法来验证安全传播。

于 2011-02-20T05:12:01.520 回答