我在使用基于EJB 3技术的应用程序时遇到了一些问题。
我想在会话bean中使用Facade Pattern来将我的客户端(Web应用程序)与我的Entity Bean分离。
我正在使用SFSB来管理用户会话。
所以我有一个FacadeLoginRemote
远程接口,向客户端公开方法doLogin()
,doLogout()
等等......
目前,此SFSB还包括一些其他方法,例如getCourse(int id)
,getResource(int id)
。并非所有用户都可以获取课程并获取资源,因此Facade会在将值返回给客户端之前执行一些检查。
我想拆分Facade,将方法getCourse()
和getResource()
放在一个特殊的类中,但保留FacadeLoginRemote
检查用户权限的功能。
如果我制作了一些不同的SLSB,我会将它们暴露给客户端。因此,客户端可以直接连接到它们,避免来自FacadeLoginRemote
的检查。
我错了吗?有没有办法做到这一点?
提前致谢,
安德烈
答案 0 :(得分:2)
第一句忠告;如果您正在构建Web应用程序,那么在同一应用程序中使用Web层和业务层更为典型。在这种情况下不需要远程处理。您的会话bean将在与Web层相同的JVM中运行。
这并不是说没有任何合理的理由可以使用远程接口(有很多),但是阅读你的问题描述在我看来你可能最好使用本地bean。
或者您说的Web应用程序是由其他人在其服务器上托管的远程应用程序,他们是否使用EJB bean中的服务?
在Java EE中,可以在Web模块中完成身份验证。特别是如果您使用的是本地bean,则此身份验证(安全主体)将自动传播到EJB bean。您可以注释EJB bean以要求特定的安全角色。如果用户未经过身份验证,则她没有该角色,服务将被拒绝。
在这种情况下,如果客户端尝试直接连接到具有getCourse()
等方法的bean,则无关紧要。
我想知道你是如何在EJB中实现doLogin()
的。我的猜测是你在那里做了一些自定义,不幸的是,据我所知,EJB3没有一种直接的方法来通过特定bean上的特定方法进行编程登录。安全性主要是声明性的,然后在访问任何bean时,客户端必须提供身份验证详细信息。例如。当您从远程JNDI请求bean时,您必须使用与远程服务器的初始JNDI连接提供这些详细信息。