我正在研究JAAS,并且正在实现一个简单的示例,以便在使用Tomcat和JaasRealm的web应用程序中使用。
现在我的问题是我不知道如何检索主题,因为类似的代码Subject subject = Subject.getSubject(AccessController.getContext());总是返回null。
Subject subject = Subject.getSubject(AccessController.getContext());
我正在使用Tomcat 7.0.27。有什么我想念的吗?换句话说,如何使用JAAS管理Java EE中的授权?例如,如何在JAAS的安全上下文中实施操作?
我知道这一点,而且可行,但是我需要检索主题才能获得角色原则
不幸的是,它在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()在该实例上将返回相同的字符串。
kaz.zak.FooPrincipal
HttpServletRequest#getUserPrincipal()
org.jboss.security.SimplePrincipal
getName()
有关此主题的更多背景信息:
最后一个消息来源基本上是用不同的措辞说同样的话。
尽管可以在Tomcat中将JAAS用作身份验证机制(JAASRealm),但是一旦对用户进行身份验证,JAAS框架的灵活性就会丧失。这是因为主体用于表示“用户”和“角色”的概念,并且在执行webapp的安全性上下文中不再可用。身份验证的结果仅可通过request.getRemoteUser()和request.isUserInRole()获得。 这将用于授权目的的JAAS框架简化为一个简单的用户/角色系统,该系统失去了与Java安全策略的联系。
尽管可以在Tomcat中将JAAS用作身份验证机制(JAASRealm),但是一旦对用户进行身份验证,JAAS框架的灵活性就会丧失。这是因为主体用于表示“用户”和“角色”的概念,并且在执行webapp的安全性上下文中不再可用。身份验证的结果仅可通过request.getRemoteUser()和request.isUserInRole()获得。
这将用于授权目的的JAAS框架简化为一个简单的用户/角色系统,该系统失去了与Java安全策略的联系。