所有这些都涉及到很多管道。更棘手的部分是:
- 处理注释并尊重非继承和覆盖规则(不是指 xml 覆盖)
- 确保注释不会被滥用或错误应用
- 尊重 xml 并覆盖注释数据
- 将“允许的角色”与声明的“角色”映射(存在一定程度的间接性)
- 将所有元数据作为格式正确的权限字符串添加到 JACC 提供程序
- 通过正确配置的 JAAS LoginModule 处理登录
- 一些将 JAAS 与 JACC 集成的创意代码(没有标准的方法来做到这一点)
- 通过
doAs
电话或ThreadLocal
- 代理所有对象,以便您可以在实际调用方法之前进行身份验证检查
- 更改使用 @RunAs 注释的方法的安全上下文并确保 RunAs 角色是已声明的角色
- 处理
EJBContext.getCallerPrincipal()
(aSubject
有很多Principal
对象,因此您必须选择一个返回并确保您可以始终选择相同的一个)
- 连接
EJBContext.isCallerInRole(String)
到 JACC 提供程序
- 确保在处理登录失败、授权失败和各种其他情况时使用正确的异常类
这就是容器的作用。JAAS 和 JACC 所做的工作真的很小。当然至少没有那么注重细节。
这些都不能像您希望的那样真正“注入”。安全性实际上是一种围绕建议。
从表面上看,基于注释的安全性之类的东西看起来非常简单。然而,当你探索所有的组合、注意事项和条件时,它确实加起来了。我记得上面所有这些细节,因为当我第一次必须实施它们时,我把它们全都弄错了。:) 谢天谢地 TCKs。
我不建议尝试制作自己的安全测试框架。
如果您确实希望以特定的方式进行测试,那么最明智的做法就是参与 OpenEJB 或 Arquillian。
OpenEJB 中所有最酷的特性都来自于用户的疼痛和痛苦,以及人们向我们描述的“当我这样做的时候很痛”。我们喜欢它。它是功能的重要来源,是获得新贡献者的好方法,也是证明可能有利于将其引入规范的想法的绝妙方法(例如 EJB 3.1 中的 Embedded EJBContainer API)。
我怎么强调参与创新而不是试图绕过它是多么重要。如果某样东西不能满足你的需求,那就要求更好。
最后的声明更针对整个世界:)