Ing*_*her 10 ejb glassfish java-ee ejb-3.1 glassfish-3
我正在使用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添加角色?在这里找到一个相关的帖子.
Javadoc 确实明确提到了这一要求:
/**
* Tests if the caller has a given role.
*
* @param roleName - The name of the security role. The role must be one of the security roles that
* is defined in the deployment descriptor.
* @return True if the caller has the specified role.
*/
public boolean isCallerInRole(String roleName);
Run Code Online (Sandbox Code Playgroud)
然而,我发现至少在 JBoss AS 中根本不需要提前声明这些角色。在我们的例子中,主体角色是在系统中动态创建的,并在身份验证发生时进行分配。因此不可能预先声明这些。
然而,isCallerInRole 方法运行得非常好。
我意识到切换到 JBoss AS 并不是一个解决方案,但也许这些信息对某些人来说是有价值的。
| 归档时间: |
|
| 查看次数: |
3531 次 |
| 最近记录: |