我正在使用Glassfish 3.1,B06开发Java EE 6应用程序.为了保护我的应用程序,我正在使用JDBCRealm和编程安全性.这可以很好地检查用户名和密码.但是当谈到声明安全角色时,我遇到了一个问题:
要在Java EE 6中使用安全角色,我必须在EJB部署描述符和Glassfish特定的部署描述符中声明这些角色以链接这些角色(如Java EE 6教程中所述)仅我可以使用方法isCallerInRole(String roleRef)在EJB内部检查权限.
这对我的应用程序来说是不可取的,因为我希望能够动态地和以编程方式添加安全角色,而不必编写XML文件(例如,可以在数据库中定义角色名称).
我刚刚通过GF3源代码进行了调试,并在com.sun.ejb.containers.EjbContextImpl中看到了isCallerInRole的实现.容器从EJB描述符中获取角色:
public boolean isCallerInRole(String roleRef) {
(...)
EjbDescriptor ejbd = container.getEjbDescriptor();
RoleReference rr = ejbd.getRoleReferenceByName(roleRef);
(...)
}
Run Code Online (Sandbox Code Playgroud)
我环顾四周,发现如果我能以某种方式在我的应用程序中获取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);
Run Code Online (Sandbox Code Playgroud)
有人做过这样的事情,还是对此有所了解?是否可以在我的应用程序中使用Ejb部署描述符?还是有更好的方法?
PS或我应该使用MBeans添加角色?在这里找到一个相关的帖子.