Tomcat-Jaas - 如何检索主题?

sas*_*n85 5 tomcat jaas java-ee jaspic

我正在研究JAAS,我正在实现一个使用Tomcat和JaasRealm在webapp中使用的简单示例.

现在我的问题是我不知道如何检索主题,因为代码Subject subject = Subject.getSubject(AccessController.getContext());总是返回null.

我正在使用Tomcat 7.0.27.有没有我错过的东西?换句话说,如何使用JAAS管理Java EE中的授权?例如,如何在JAAS的安全上下文中实现操作?

Arj*_*jms 8

我知道它并且它有效,但我需要检索主题以获得角色原则

不幸的是,它在Java EE中的工作方式不同.JAAS主题只是一个"主要包",其中哪些代表用户/调用者主体和/或角色主体根本不是标准化的.每个其他容器在这里做不同的事情.Tomcat的JAASRealmJavadoc描述了这个并解释了Tomcat特定的约定(强调我的):

JAAS规范描述了作为javax.security.auth.Subject实例成功登录的结果,该实例可以在Subject.getPrincipals()方法的返回值中包含零个或多个java.security.Principal对象.但是,它没有提供有关如何区分描述单个用户的主体(因此适合作为web应用程序中的request.getUserPrincipal()的值返回)来自描述其授权角色的主体的指导.用户.为了尽可能多地保持JAAS执行的基础LoginMethod实现的独立性,本领域实现了以下策略:[...]

除此之外,从Java EE环境中,您甚至很少能够访问JAAS主题,甚至通常不会通过供应商特定的方法.JAAS远不是您认为的通用标准,特别是当它涉及Java EE时.

您可以以可移植方式访问的唯一内容是调用者主体和与之关联的角色,但即使这些内容也不一定是您的JAAS登录模块构造的确切调用者主体.

例如,JBoss AS使用自己的类复制此主体几次.因此,如果您的JAAS模块kaz.zak.FooPrincipal为用户/调用者主体存储了一个Subject,那么HttpServletRequest#getUserPrincipal()可能会返回一个org.jboss.security.SimplePrincipal.唯一保证的是getName()在该实例上将返回相同的字符串.

有关此主题的更多背景知识:

最后一个来源基本上用不同的措辞说同样的事情;

尽管可以在Tomcat中使用JAAS作为身份验证机制(JAASRealm),但一旦用户通过身份验证,JAAS框架的灵活性就会丢失.这是因为主体用于表示"用户"和"角色"的概念,并且在执行webapp的安全上下文中不再可用.身份验证的结果只能通过request.getRemoteUser()和request.isUserInRole()获得.

这将JAAS框架的授权目的简化为一个简单的用户/角色系统,该系统失去了与Java安全策略的连接.