我知道这一点,而且可行,但是我需要检索主题才能获得角色原则
不幸的是,它在Java
EE中无法正常工作。JAAS主题只是一个“委托人包”,其中哪个代表用户/呼叫者委托人和/或角色委托人根本就没有标准化。每个其他容器在这里所做的事情都不同。Tomcat的JAASRealm的Javadoc对此进行了描述,并解释了Tomcat特定的约定(重点是我的):
JAAS规范将成功登录的结果描述为javax.security.auth.Subject实例,该实例在Subject.getPrincipals()方法的返回值中可以包含零个或多个java.security.Principal对象。但是,
它没有提供
有关如何区分描述单个用户的Principal(因此适合作为Web应用程序中的request.getUserPrincipal()的值返回)与描述此用户授权角色的Principal的指南。用户。为了尽可能与JAAS执行的基础LoginMethod实现保持独立,此领域实现了以下策略:[…]
除此之外,从Java EE环境中,您甚至几乎都无法通过供应商特定的方法来访问JAAS主题。JAAS与您似乎认为的通用标准相距甚远,尤其是在涉及Java
EE时。
您可以通过可移植方式访问的唯一内容是调用者主体和与之关联的角色,但是即使这些也不必是您的JAAS登录模块构造的确切调用者主体。
例如,JBoss
AS使用其自己的类多次复制了此主体。因此,如果您的JAAS模块将a存储
kaz.zak.FooPrincipal到用户/调用者主体的Subject中,则
HttpServletRequest#getUserPrincipal()可能返回a
org.jboss.security.SimplePrincipal。唯一可以保证的是,
getName()在该实例上将返回相同的字符串。
有关此主题的更多背景信息:
- 使用JASPIC在Java EE中实现容器认证
- JAAS发生了什么?
- 将JAAS与Tomcat一起使用
最后一个消息来源基本上是用不同的措辞说同样的话。
尽管可以在Tomcat中将JAAS用作身份验证机制(JAASRealm),但是一旦对用户进行身份验证,JAAS框架的灵活性就会丧失。这是因为主体用于表示“用户”和“角色”的概念,并且在执行webapp的安全性上下文中不再可用。身份验证的结果仅可通过request.getRemoteUser()和request.isUserInRole()获得。
这将用于授权目的的JAAS框架简化为一个简单的用户/角色系统,该系统失去了与Java安全策略的联系。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)