【发布时间】:2011-04-19 06:10:35
【问题描述】:
我正在使用 Glassfish 3.1、B06 开发一个 Java EE 6 应用程序。 为了保护我的应用程序,我使用了 JDBCRealm 和编程安全性。这可以很好地检查用户名和密码。但是在声明安全角色时,我遇到了一个问题:
要在 Java EE 6 中使用安全角色,我必须在 EJB 部署描述符和 Glassfish 特定部署描述符中声明这些角色以链接这些角色(如 Java EE 6-tutorial 中所述) 只有我可以在 EJB 中使用方法 isCallerInRole(String roleRef) 来检查权限。
这对我的应用程序来说是不可取的,因为我希望它可以动态地和以编程方式添加安全角色,而无需编写 XML 文件(例如,可以在数据库中定义角色名称)。
我刚刚调试了GF3的源代码,看到了com.sun.ejb.containers.EjbContextImpl中isCallerInRole的实现。容器在那里从 EJB 描述符中获取角色:
public boolean isCallerInRole(String roleRef) {
(...)
EjbDescriptor ejbd = container.getEjbDescriptor();
RoleReference rr = ejbd.getRoleReferenceByName(roleRef);
(...)
}
我环顾四周,发现如果我能以某种方式在我的应用程序中获取 EJB 描述符,我可以添加这样的角色:
EjbDescriptor ejbd = //??? Can i use that descriptor inside my app, or is that "forbidden"?
RoleReference rr = new RoleReference("admin", "Admins are allowed to do everything");
ejbd.addRoleReference(rr);
有人做过类似的事情,或者对此有一些想法吗?是否可以在我的应用程序中使用 Ejb 部署描述符?还是有更好的方法?
附:还是应该使用 MBeans 添加角色?找到了一个相当相关的帖子here。
【问题讨论】:
-
顺便说一句,我鼓励您升级到更新版本的 GlassFish Server 3.1。该团队最近发布了 build 22。
-
谢谢。不幸的是,我们有一些库在更高版本的 Glassfish 中出现问题,所以我们必须坚持使用 06,直到这些库中的几个错误得到修复
标签: jakarta-ee glassfish ejb glassfish-3 ejb-3.1