- 所有已实现的接口:
-
Serializable
Subject
表示单个实体(例如人员)的相关信息分组。这些信息包括主体的身份以及其与安全相关的属性(例如密码和加密密钥)。
主体可能具有多个身份。每个身份在Subject
内表示为Principal
。Principal简单地将名称绑定到Subject
。例如,一个作为人员Alice的Subject
可能有两个Principal:一个将她驾驶执照上的名称“Alice Bar”绑定到Subject
,另一个将她学生证件上的号码“999-99-9999”绑定到Subject
。尽管每个Principal具有不同的名称,但两个Principal都指向同一个Subject
。
Subject
还可以拥有与安全相关的属性,称为凭据。需要特殊保护的敏感凭据,例如私有加密密钥,存储在私有凭据Set
中。用于共享的凭据,例如公钥证书或Kerberos服务器票证,存储在公共凭据Set
中。访问和修改不同凭据集合需要不同的权限。
要检索与Subject
关联的所有Principal,调用getPrincipals
方法。要检索属于Subject
的所有公共或私有凭据,分别调用getPublicCredentials
方法或getPrivateCredentials
方法。要修改返回的Principal和凭据Set
,请使用Set
类中定义的方法。例如:
Subject subject; Principal principal; Object credential; // 向Subject添加Principal和凭据 subject.getPrincipals().add(principal); subject.getPublicCredentials().add(credential);
这个Subject
类实现了Serializable
。虽然与Subject
关联的Principal被序列化,但与Subject
关联的凭据没有被序列化。请注意,java.security.Principal
类没有实现Serializable
。因此,与Subjects关联的所有具体Principal
实现都必须实现Serializable
。
- 自从:
- 1.4
- 参见:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic <T> T
使用subject
作为当前主体执行Callable
。static Subject
current()
返回当前主体。static <T> T
doAs
(Subject subject, PrivilegedAction<T> action) 已弃用,将来会移除: 此API元素可能在将来的版本中被移除。static <T> T
doAs
(Subject subject, PrivilegedExceptionAction<T> action) 已弃用,将来会移除: 此API元素可能在将来的版本中被移除。此方法依赖于AccessControlContext
,与Security Manager
一起,已被弃用并可能在将来的版本中被移除。static <T> T
doAsPrivileged
(Subject subject, PrivilegedAction<T> action, AccessControlContext acc) 已弃用,将来会移除: 此API元素可能在将来的版本中被移除。此方法仅在与Security Manager
一起使用时有用,Security Manager
已被弃用并可能在将来的版本中被移除。static <T> T
doAsPrivileged
(Subject subject, PrivilegedExceptionAction<T> action, AccessControlContext acc) 已弃用,将来会移除: 此API元素可能在将来的版本中被移除。此方法仅在与Security Manager
一起使用时有用,Security Manager
已被弃用并可能在将来的版本中被移除。boolean
将指定的对象与此Subject
进行比较以确定是否相等。返回与此Subject
关联的Principal集合。getPrincipals
(Class<T> c) 返回与此Subject
关联的是指定Class
的实例或子类的Principal集合。返回此Subject
持有的私有凭据集合。<T> Set
<T> getPrivateCredentials
(Class<T> c) 返回与此Subject
关联的是指定Class
的实例或子类的私有凭据集合。返回此Subject
持有的公共凭据集合。<T> Set
<T> getPublicCredentials
(Class<T> c) 返回与此Subject
关联的是指定Class
的实例或子类的公共凭据集合。static Subject
已弃用,将来会移除: 此API元素可能在将来的版本中被移除。此方法依赖于AccessControlContext
,与Security Manager
一起,已被弃用并可能在将来的版本中被移除。int
hashCode()
返回此Subject
的哈希码。boolean
查询此Subject
是否为只读。void
将此Subject
设置为只读。toString()
返回此Subject
的字符串表示形式。
-
Constructor Details
-
Subject
public Subject()创建一个具有空的Principal集合和空的公共和私有凭据集合的Subject
实例。新构建的集合在允许后续修改之前会检查此
Subject
是否已设置为只读。新创建的集合还通过确保调用者具有足够的权限来防止非法修改。这些集合还禁止空元素,尝试添加、查询或删除空元素将导致NullPointerException
。要修改Principal集合,调用者必须具有
AuthPermission("modifyPrincipals")
。要修改公共凭据集合,调用者必须具有AuthPermission("modifyPublicCredentials")
。要修改私有凭据集合,调用者必须具有AuthPermission("modifyPrivateCredentials")
。 -
Subject
public Subject(boolean readOnly, Set<? extends Principal> principals, Set<?> pubCredentials, Set<?> privCredentials) 创建一个具有Principal和凭据的Subject
实例。从指定的集合中的Principal和凭据被复制到新构建的集合中。这些新创建的集合在允许后续修改之前会检查此
Subject
是否已设置为只读。新创建的集合还通过确保调用者具有足够的权限来防止非法修改。这些集合还禁止空元素,尝试添加、查询或删除空元素将导致NullPointerException
。要修改Principal集合,调用者必须具有
AuthPermission("modifyPrincipals")
。要修改公共凭据集合,调用者必须具有AuthPermission("modifyPublicCredentials")
。要修改私有凭据集合,调用者必须具有AuthPermission("modifyPrivateCredentials")
。- 参数:
-
readOnly
- 如果Subject
应为只读,则为true;否则为false。 -
principals
- 要与此Subject
关联的Principal集合。 -
pubCredentials
- 要与此Subject
关联的公共凭据集合。 -
privCredentials
- 要与此Subject
关联的私有凭据集合。 - 抛出:
-
NullPointerException
- 如果指定的principals
、pubCredentials
或privCredentials
为null
,或这三个集合中存在空值。
-
-
Method Details
-
setReadOnly
public void setReadOnly()将此Subject
设置为只读。对此主体的
Principal
集合和凭据集合的修改(添加和删除)将被禁止。仍然允许对此主体凭据的destroy
操作。后续尝试修改主体的
Principal
和凭据集合将导致抛出IllegalStateException
。此外,一旦Subject
为只读,就无法将其重新设置为可写。- 抛出:
-
SecurityException
- 如果安装了安全管理器并且调用者没有AuthPermission("setReadOnly")
权限将此Subject
设置为只读。
-
isReadOnly
public boolean isReadOnly()查询此Subject
是否为只读。- 返回:
-
如果此
Subject
为只读,则为true;否则为false。
-
getSubject
Deprecated, for removal: This API element is subject to removal in a future version.This method depends onAccessControlContext
which, in conjunction with the Security Manager, is deprecated and subject to removal in a future release. However, obtaining a Subject is useful independent of the Security Manager. Thus, a replacement API namedcurrent()
has been added which can be used to obtain the current subject.获取与提供的AccessControlContext
关联的Subject
。AccessControlContext
可能包含许多主体(来自嵌套的doAs
调用)。在这种情况下,将返回与AccessControlContext
最近关联的Subject
。- 参数:
-
acc
- 从中检索Subject
的AccessControlContext
。 - 返回:
-
与提供的
AccessControlContext
关联的Subject
,如果没有与提供的AccessControlContext
关联的Subject
,则返回null
。 - 抛出:
-
SecurityException
- 如果安装了安全管理器并且调用者没有AuthPermission("getSubject")
权限来获取Subject
。 -
NullPointerException
- 如果提供的AccessControlContext
为null
。
-
current
返回当前主体。当前主体由
callAs(subject, action)
方法安装。当调用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
- 作为其当前主体运行的代码。不得为null
。 - 返回:
-
action
的call
方法返回的值 - 抛出:
-
NullPointerException
- 如果action
为null
-
CompletionException
- 如果action.call()
抛出异常。CompletionException
的原因设置为action.call()
抛出的异常。 - 自版本:
- 18
- 参见:
-
doAs
@Deprecated(since="18", forRemoval=true) public static <T> T doAs(Subject subject, PrivilegedAction<T> action) Deprecated, for removal: This API element is subject to removal in a future version.This method depends onAccessControlContext
which, in conjunction with the Security Manager, is deprecated and subject to removal in a future release. However, performing work as a Subject is useful independent of the Security Manager. Thus, a replacement API namedcallAs(javax.security.auth.Subject, java.util.concurrent.Callable<T>)
has been added which can be used to perform the same work.作为特定Subject
执行工作。此方法首先通过
AccessController.getContext
检索当前线程的AccessControlContext
,然后使用检索到的上下文以及使用提供的Subject
构造的新SubjectDomainCombiner
实例化一个新的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 Deprecated, for removal: This API element is subject to removal in a future version.This method depends onAccessControlContext
which, in conjunction with the Security Manager, is deprecated and subject to removal in a future release. However, performing work as a Subject is useful independent of the Security Manager. Thus, a replacement API namedcallAs(javax.security.auth.Subject, java.util.concurrent.Callable<T>)
has been added which can be used to perform the same work.作为特定Subject
执行工作。此方法首先通过
AccessController.getContext
检索当前线程的AccessControlContext
,然后使用检索到的上下文以及使用提供的Subject
构造的新SubjectDomainCombiner
实例化一个新的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) Deprecated, for removal: This API element is subject to removal in a future version.This method is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this method is also deprecated and subject to removal. There is no replacement for the Security Manager or this method.作为特定Subject
执行特权工作。此方法与
Subject.doAs
完全相同,只是不是检索当前线程的AccessControlContext
,而是使用提供的AccessControlContext
。如果提供的AccessControlContext
为null
,则此方法将实例化一个具有一组空的ProtectionDomains的新AccessControlContext
。- 类型参数:
-
T
-PrivilegedAction
的run
方法返回的值的类型。 - 参数:
-
subject
- 指定action
将作为其运行的Subject
。此参数可能为null
。 -
action
- 作为指定Subject
运行的代码。 -
acc
- 与指定的subject和action绑定的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 Deprecated, for removal: This API element is subject to removal in a future version.This method is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this method is also deprecated and subject to removal. There is no replacement for the Security Manager or this method.作为特定Subject
执行特权工作。此方法与
Subject.doAs
完全相同,只是不是检索当前线程的AccessControlContext
,而是使用提供的AccessControlContext
。如果提供的AccessControlContext
为null
,则此方法将实例化一个具有一组空的ProtectionDomains的新AccessControlContext
。- 类型参数:
-
T
- 由PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
subject
- 指定的action
将作为其运行的Subject
。此参数可以为null
。 -
action
- 要作为指定的Subject
运行的代码。 -
acc
- 与指定的subject和action绑定的AccessControlContext
。 - 返回:
-
由PrivilegedExceptionAction的
run
方法返回的值。 - 抛出:
-
PrivilegedActionException
- 如果PrivilegedExceptionAction.run
方法抛出已检查异常。 -
NullPointerException
- 如果指定的PrivilegedExceptionAction
为null
。 -
SecurityException
- 如果安装了安全管理器且调用者没有AuthPermission("doAsPrivileged")
权限来调用此方法。
-
getPrincipals
返回与此Subject
关联的Principal
集合。每个Principal
代表此Subject
的身份。返回的
Set
由此Subject的内部Principal
Set
支持。对返回的Set
的任何修改也会影响内部Principal
Set
。如果安装了安全管理器,则调用者必须具有
AuthPermission("modifyPrincipals")
权限来修改返回的集合,否则将抛出SecurityException
。- 返回:
-
与此
Subject
关联的Principal
集合。
-
getPrincipals
返回与此Subject
关联且是指定Class
的实例或子类的Principal
集合。返回的
Set
不由此Subject的内部Principal
Set
支持。每次方法调用都会创建并返回一个新的Set
。对返回的Set
的修改不会影响内部Principal
Set
。- 类型参数:
-
T
- 由c
建模的类的类型 - 参数:
-
c
- 所有返回的Principal
都将是此类的实例。 - 返回:
-
是指定
Class
的实例的Principal
集合。 - 抛出:
-
NullPointerException
- 如果指定的Class
为null
。
-
getPublicCredentials
返回此Subject
持有的公共凭据的Set
。返回的
Set
由此Subject的内部公共凭据Set
支持。对返回的Set
的任何修改也会影响内部公共凭据Set
。如果安装了安全管理器,则调用者必须具有
AuthPermission("modifyPublicCredentials")
权限来修改返回的集合,否则将抛出SecurityException
。- 返回:
-
此
Subject
持有的公共凭据的Set
。
-
getPrivateCredentials
返回此Subject
持有的私有凭据的Set
。返回的
Set
由此Subject的内部私有凭据Set
支持。对返回的Set
的任何修改也会影响内部私有凭据Set
。如果安装了安全管理器,则调用者必须具有
AuthPermission("modifyPrivateCredentials")
权限来修改返回的集合,否则将抛出SecurityException
。在遍历
Set
时,如果安装了安全管理器且调用者没有PrivateCredentialPermission
来访问特定凭据,则会抛出SecurityException
。尽管如此,Iterator
仍会前进到Set
中的下一个元素。- 返回:
-
此
Subject
持有的私有凭据的Set
。
-
getPublicCredentials
返回与此Subject
关联且是指定Class
的实例或子类的公共凭据的Set
。返回的
Set
不由此Subject的内部公共凭据Set
支持。每次方法调用都会创建并返回一个新的Set
。对返回的Set
的修改不会影响内部公共凭据Set
。- 类型参数:
-
T
- 由c
建模的类的类型 - 参数:
-
c
- 所有返回的公共凭据都将是此类的实例。 - 返回:
-
是指定
Class
的实例的公共凭据的Set
。 - 抛出:
-
NullPointerException
- 如果指定的Class
为null
。
-
getPrivateCredentials
返回与此Subject
关联且是指定Class
的实例或子类的私有凭据的Set
。如果安装了安全管理器,则调用者必须具有
PrivateCredentialPermission
来访问所有请求的凭据,否则将抛出SecurityException
。返回的
Set
不由此Subject的内部私有凭据Set
支持。每次方法调用都会创建并返回一个新的Set
。对返回的Set
的修改不会影响内部私有凭据Set
。- 类型参数:
-
T
- 由c
建模的类的类型 - 参数:
-
c
- 所有返回的私有凭据都将是此类的实例。 - 返回:
-
是指定
Class
的实例的私有凭据的Set
。 - 抛出:
-
NullPointerException
- 如果指定的Class
为null
。
-
equals
将指定的对象与此Subject
进行比较以确定是否相等。如果给定对象也是一个Subject
且两个Subject
实例是等价的,则返回true。更正式地说,如果它们的Principal
和Credential
集合相等,则两个Subject
实例是相等的。- 覆盖:
-
equals
在类Object
中 - 参数:
-
o
- 用于与此Subject
比较是否相等的对象。 - 返回:
-
如果指定的对象等于此
Subject
,则返回true。 - 抛出:
-
SecurityException
- 如果安装了安全管理器且调用者没有PrivateCredentialPermission
权限来访问此Subject
或提供的私有凭据。 - 参见:
-
toString
返回此Subject
的字符串表示形式。 -
hashCode
public int hashCode()返回此Subject
的哈希码。- 覆盖:
-
hashCode
在类Object
中 - 返回:
-
此
Subject
的哈希码。 - 抛出:
-
SecurityException
- 如果安装了安全管理器且调用者没有PrivateCredentialPermission
权限来访问此Subject
的私有凭据。 - 参见:
-
AccessControlContext
,与Security Manager
一起,已被弃用并可能在将来的版本中被移除。