- 所有已实现的接口:
Serializable
Subject 表示单个实体(例如人)的一组相关信息。此类信息包括主体的身份及其与安全相关的属性(例如,密码和加密密钥)。
受试者可能具有多重身份。每个身份都表示为 Subject 中的 Principal。校长只需将名称绑定到 Subject 即可。例如,恰好是一个人 Alice 的 Subject 可能有两个委托人:一个将她驾驶执照上的名字“Alice Bar”绑定到 Subject,另一个绑定“999-99-9999” ,她的学生证上的号码,到Subject。两个 Principal 都引用相同的 Subject,尽管每个 Principal 的名称不同。
Subject 也可能拥有与安全相关的属性,这些属性被称为凭证。需要特殊保护的敏感凭据(例如私人加密密钥)存储在私人凭据 Set 中。用于共享的凭据(例如公钥证书或 Kerberos 服务票证)存储在公共凭据 Set 中。访问和修改不同的凭证集需要不同的权限。
要检索与 Subject 关联的所有主体,请调用 getPrincipals 方法。要检索属于 Subject 的所有公共或私有凭证,请分别调用 getPublicCredentials 方法或 getPrivateCredentials 方法。要修改返回的 Set of Principals 和凭据,请使用 Set 类中定义的方法。例如:
Subject subject; Principal principal; Object credential; // add a Principal and credential to the Subject subject.getPrincipals().add(principal); subject.getPublicCredentials().add(credential);
这个 Subject 类实现了 Serializable。虽然与 Subject 关联的主体被序列化,但与 Subject 关联的凭据没有。请注意,java.security.Principal 类未实现 Serializable。因此,与 Subjects 关联的所有具体 Principal 实现都必须实现 Serializable 。
- 自从:
- 1.4
- 参见:
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述static <T> T以subject作为当前主题执行Callable。static Subjectcurrent()返回当前主题。static <T> TdoAs(Subject subject, PrivilegedAction<T> action) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。static <T> TdoAs(Subject subject, PrivilegedExceptionAction<T> action) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法取决于AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。static <T> TdoAsPrivileged(Subject subject, PrivilegedAction<T> action, AccessControlContext acc) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法仅与 安全管理器 结合使用,后者已弃用并会在未来版本中删除。static <T> TdoAsPrivileged(Subject subject, PrivilegedExceptionAction<T> action, AccessControlContext acc) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法仅与 安全管理器 结合使用,后者已弃用并会在未来版本中删除。boolean比较指定的 Object 与 thisSubject是否相等。返回与此Subject关联的委托人的Set。getPrincipals(Class<T> c) 返回与此Subject关联的主体的Set,它们是指定的Class的实例或子类。返回此Subject持有的私人凭证的Set。<T> Set<T>getPrivateCredentials(Class<T> c) 返回与此Subject关联的私有凭证的Set,它们是指定Class的实例或子类。返回此Subject持有的公共凭证的Set。<T> Set<T>getPublicCredentials(Class<T> c) 返回与此Subject关联的公共凭证的Set,它们是指定Class的实例或子类。static Subject已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法取决于AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。inthashCode()返回此Subject的哈希码。boolean查询这个Subject是否只读。void将此Subject设置为只读。toString()返回此Subject的字符串表示形式。
-
构造方法详细信息
-
Subject
public Subject()使用空的SetPrincipals 和空的公共和私有凭证集创建Subject的实例。新构造的 Sets 在允许后续修改之前检查此
Subject是否已设置为只读。新创建的 Sets 还通过确保调用者具有足够的权限来防止非法修改。这些 Sets 还禁止空元素,并且尝试添加、查询或删除空元素将导致NullPointerException。要修改主体集,调用者必须具有
AuthPermission("modifyPrincipals")。要修改公共凭证集,调用者必须具有AuthPermission("modifyPublicCredentials")。要修改私有凭证集,调用者必须具有AuthPermission("modifyPrivateCredentials")。 -
Subject
public Subject(boolean readOnly, Set <? extends Principal > principals, Set <?> pubCredentials, Set <?> privCredentials) 使用主体和凭据创建Subject的实例。来自指定集合的主体和凭据被复制到新构造的集合中。这些新创建的 Set 在允许后续修改之前检查此
Subject是否已设置为只读。新创建的 Sets 还通过确保调用者具有足够的权限来防止非法修改。这些 Sets 还禁止空元素,并且尝试添加、查询或删除空元素将导致NullPointerException。要修改主体集,调用者必须具有
AuthPermission("modifyPrincipals")。要修改公共凭证集,调用者必须具有AuthPermission("modifyPublicCredentials")。要修改私有凭证集,调用者必须具有AuthPermission("modifyPrivateCredentials")。- 参数:
readOnly- 如果Subject为只读,则为真,否则为假。principals- 要与此Subject关联的委托人的Set。pubCredentials- 与此Subject关联的公共凭证的Set。privCredentials- 与此Subject关联的私有凭证的Set。- 抛出:
NullPointerException- 如果指定的principals、pubCredentials或privCredentials是null,或者在这三个集合中的任何一个中存在空值。
-
-
方法详情
-
setReadOnly
public void setReadOnly()将此Subject设置为只读。不允许对此主题的
PrincipalSet和凭证集进行修改(添加和删除)。仍然允许对该主题的凭据进行destroy操作。随后尝试修改主题的
Principal和凭据集将导致抛出IllegalStateException。此外,一旦Subject为只读,就无法将其重新设置为可写。- 抛出:
SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("setReadOnly")权限将此Subject设置为只读。
-
isReadOnly
public boolean isReadOnly()查询这个Subject是否只读。- 返回:
-
如果此
Subject是只读的,则为 true,否则为 false。
-
getSubject
@Deprecated (since ="17", forRemoval =true) public static Subject getSubject(AccessControlContext acc) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法取决于AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。但是,独立于安全管理器获取主题是有用的。因此,已添加名为current()的替换 API,可用于获取当前主题。获取与提供的AccessControlContext关联的Subject。AccessControlContext可能包含许多主题(来自嵌套的doAs调用)。在这种情况下,返回与AccessControlContext关联的最新Subject。- 参数:
acc- 从中检索Subject的AccessControlContext。- 返回:
Subject与提供的AccessControlContext关联,或者null如果没有Subject与提供的AccessControlContext关联。- 抛出:
SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("getSubject")权限来获取Subject。NullPointerException- 如果提供的AccessControlContext是null。
-
current
返回当前主题。当前主题是通过
callAs(javax.security.auth.Subject, java.util.concurrent.Callable<T>)方法安装的。当调用callAs(subject, action)时,action以subject作为其当前主题执行,可以通过此方法检索。action完成后,当前主题将重置为其先前的值。在第一次调用callAs()之前,当前主题是null。- 实现注意事项:
-
此方法返回与
Subject.getSubject(AccessController.getContext())相同的值。这保留了与可能仍在调用doAs的代码的兼容性,后者将主题安装在AccessControlContext中。此行为可能会在未来版本中发生变化。 - 返回:
-
当前主题,或
null如果未安装当前主题或当前主题设置为null。 - 自从:
- 18
- 参见:
-
callAs
以subject作为当前主题执行Callable。- 实现注意事项:
-
此方法调用
Subject.doAs(subject, altAction)将主题存储在新的AccessControlContext中,其中altAction.run()等同于action.call()并修改抛出的异常以匹配此方法的规范。这保留了与可能仍在调用getSubject(AccessControlContext)的代码的兼容性,后者从AccessControlContext检索主题。此行为可能会在未来版本中发生变化。 - 类型参数:
T-action的call方法返回值的类型- 参数:
subject- 指定的action将运行的Subject。这个参数可能是null。action- 以subject作为当前主题运行的代码。不能是null。- 返回:
action的call方法返回的值- 抛出:
NullPointerException- 如果action是nullCompletionException- 如果action.call()抛出异常。CompletionException的原因设置为action.call()抛出的异常。- 自从:
- 18
- 参见:
-
doAs
@Deprecated (since ="18", forRemoval =true) public static <T> T doAs(Subject subject, PrivilegedAction <T> action) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法取决于AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。但是,独立于安全管理器,作为主题执行工作是有用的。因此,已添加名为callAs(javax.security.auth.Subject, java.util.concurrent.Callable<T>)的替换 API,可用于执行相同的工作。作为特定的Subject执行工作。此方法首先通过
AccessController.getContext检索当前线程的AccessControlContext,然后使用检索到的上下文和新的SubjectDomainCombiner(使用提供的Subject构造)实例化一个新的AccessControlContext。最后,此方法调用AccessController.doPrivileged,将提供的PrivilegedAction以及新构造的AccessControlContext传递给它。- 类型参数:
T- PrivilegedAction 的run方法返回值的类型。- 参数:
subject- 指定的action将运行的Subject。这个参数可能是null。action- 要作为指定的Subject运行的代码。- 返回:
-
PrivilegedAction 的
run方法返回的值。 - 抛出:
NullPointerException- 如果PrivilegedAction是null。SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("doAs")权限来调用此方法。
-
doAs
@Deprecated (since ="18", forRemoval =true) public static <T> T doAs(Subject subject, PrivilegedExceptionAction <T> action) throws PrivilegedActionException 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法取决于AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。但是,独立于安全管理器,作为主题执行工作是有用的。因此,已添加名为callAs(javax.security.auth.Subject, java.util.concurrent.Callable<T>)的替换 API,可用于执行相同的工作。作为特定的Subject执行工作。此方法首先通过
AccessController.getContext检索当前线程的AccessControlContext,然后使用检索到的上下文和新的SubjectDomainCombiner(使用提供的Subject构造)实例化一个新的AccessControlContext。最后,此方法调用AccessController.doPrivileged,将提供的PrivilegedExceptionAction以及新构造的AccessControlContext传递给它。- 类型参数:
T- PrivilegedExceptionAction 的run方法返回值的类型。- 参数:
subject- 指定的action将运行的Subject。这个参数可能是null。action- 要作为指定的Subject运行的代码。- 返回:
-
PrivilegedExceptionAction 的
run方法返回的值。 - 抛出:
PrivilegedActionException- 如果PrivilegedExceptionAction.run方法抛出检查异常。NullPointerException- 如果指定的PrivilegedExceptionAction是null。SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("doAs")权限来调用此方法。
-
doAsPrivileged
@Deprecated (since ="17", forRemoval =true) public static <T> T doAsPrivileged(Subject subject, PrivilegedAction <T> action, AccessControlContext acc) 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法仅与 安全管理器 结合使用,后者已弃用并会在未来版本中删除。因此,此方法也已弃用并可能被删除。安全管理器或此方法没有替代品。作为特定的Subject执行特权工作。此方法的行为与
Subject.doAs完全相同,除了它不是检索当前线程的AccessControlContext,而是使用提供的AccessControlContext。如果提供的AccessControlContext是null,此方法将实例化一个新的AccessControlContext和一个空的 ProtectionDomains 集合。- 类型参数:
T- PrivilegedAction 的run方法返回值的类型。- 参数:
subject- 指定的action将运行的Subject。这个参数可能是null。action- 要作为指定的Subject运行的代码。acc- 要绑定到指定的AccessControlContext主题和行动.- 返回:
-
PrivilegedAction 的
run方法返回的值。 - 抛出:
NullPointerException- 如果PrivilegedAction是null。SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("doAsPrivileged")权限来调用此方法。
-
doAsPrivileged
@Deprecated (since ="17", forRemoval =true) public static <T> T doAsPrivileged(Subject subject, PrivilegedExceptionAction <T> action, AccessControlContext acc) throws PrivilegedActionException 已弃用,将被删除:此 API 元素可能会在未来版本中删除。此方法仅与 安全管理器 结合使用,后者已弃用并会在未来版本中删除。因此,此方法也已弃用并可能被删除。安全管理器或此方法没有替代品。作为特定的Subject执行特权工作。此方法的行为与
Subject.doAs完全相同,除了它不是检索当前线程的AccessControlContext,而是使用提供的AccessControlContext。如果提供的AccessControlContext是null,此方法将实例化一个新的AccessControlContext和一个空的 ProtectionDomains 集合。- 类型参数:
T- PrivilegedExceptionAction 的run方法返回值的类型。- 参数:
subject- 指定的action将运行的Subject。这个参数可能是null。action- 要作为指定的Subject运行的代码。acc- 要绑定到指定的AccessControlContext主题和行动.- 返回:
-
PrivilegedExceptionAction 的
run方法返回的值。 - 抛出:
PrivilegedActionException- 如果PrivilegedExceptionAction.run方法抛出检查异常。NullPointerException- 如果指定的PrivilegedExceptionAction是null。SecurityException- 如果安装了安全管理器并且调用者没有AuthPermission("doAsPrivileged")权限来调用此方法。
-
getPrincipals
返回与此Subject关联的委托人的Set。每个Principal代表这个Subject的身份。返回的
Set由该主题的内部PrincipalSet支持。对返回的Set的任何修改也会影响内部PrincipalSet。如果安装了安全管理器,调用者必须具有
AuthPermission("modifyPrincipals")权限才能修改返回的集合,否则将抛出SecurityException。- 返回:
-
与此
Subject关联的校长的Set。
-
getPrincipals
返回与此Subject关联的主体的Set,它们是指定的Class的实例或子类。返回的
Set不受此主题的内部PrincipalSet支持。为每个方法调用创建并返回一个新的Set。对返回的Set的修改不会影响内部PrincipalSet。- 类型参数:
T- 由c建模的类的类型- 参数:
c- Principals 返回的Set将全部是此类的实例。- 返回:
-
a
Setof Principals 是指定Class的实例。 - 抛出:
NullPointerException- 如果指定的Class是null。
-
getPublicCredentials
返回此Subject持有的公共凭证的Set。返回的
Set由该主题的内部公共凭证Set支持。对返回的Set的任何修改也会影响内部公共凭证Set。如果安装了安全管理器,调用者必须具有
AuthPermission("modifyPublicCredentials")权限才能修改返回的集合,否则将抛出SecurityException。- 返回:
-
此
Subject持有的Set公共凭据。
-
getPrivateCredentials
返回此Subject持有的私人凭证的Set。返回的
Set由该主题的内部私有凭证Set支持。对返回的Set的任何修改也会影响内部私有凭证Set。如果安装了安全管理器,调用者必须具有
AuthPermission("modifyPrivateCredentials")权限才能修改返回的集合,否则将抛出SecurityException。在遍历
Set时,如果安装了安全管理器并且调用者没有PrivateCredentialPermission来访问特定凭据,则会抛出SecurityException。Iterator仍然前进到Set中的下一个元素。- 返回:
-
此
Subject持有的Set私人凭证。
-
getPublicCredentials
返回与此Subject关联的公共凭证的Set,它们是指定Class的实例或子类。返回的
Set不受此主题的内部公共凭证Set的支持。为每个方法调用创建并返回一个新的Set。对返回的Set的修改不会影响内部公共凭证Set。- 类型参数:
T- 由c建模的类的类型- 参数:
c- 返回的Set公共凭据将全部是此类的实例。- 返回:
-
作为指定
Class实例的公共凭据的Set。 - 抛出:
NullPointerException- 如果指定的Class是null。
-
getPrivateCredentials
返回与此Subject关联的私有凭证的Set,它们是指定Class的实例或子类。如果安装了安全管理器,调用者必须有
PrivateCredentialPermission才能访问所有请求的凭据,否则将抛出SecurityException。返回的
Set不受此主题的内部私有凭证Set的支持。为每个方法调用创建并返回一个新的Set。对返回的Set的修改不会影响内部私有凭证Set。- 类型参数:
T- 由c建模的类的类型- 参数:
c- 返回的Set私有凭证将全部是此类的实例。- 返回:
-
作为指定
Class实例的私有凭证的Set。 - 抛出:
NullPointerException- 如果指定的Class是null。
-
equals
比较指定的 Object 与 thisSubject是否相等。如果给定的对象也是一个 Subject 并且两个Subject实例是等价的,则返回 true。更正式地说,如果两个Subject实例的Principal和Credential集合相等,则它们相等。- 重写:
equals在类Object中- 参数:
o- 要与此Subject进行相等比较的对象。- 返回:
-
如果指定的对象等于此
Subject则为真。 - 抛出:
SecurityException- 如果安装了安全管理器并且调用者没有PrivateCredentialPermission权限来访问此Subject或提供的Subject的私有凭证。- 参见:
-
toString
返回此Subject的字符串表示形式。 -
hashCode
public int hashCode()返回此Subject的哈希码。- 重写:
hashCode在类Object中- 返回:
-
这个
Subject的哈希码。 - 抛出:
SecurityException- 如果安装了安全管理器并且调用者没有PrivateCredentialPermission权限来访问此主题的私有凭证。- 参见:
-
AccessControlContext,它与 安全管理器 一起被弃用,并在未来的版本中被删除。