- java.lang.Object
-
- javax.security.auth.Subject
-
- All Implemented Interfaces:
-
Serializable
public final class Subject extends Object implements Serializable
A
Subject
表示单个实体(例如人)的相关信息的分组。 此类信息包括主题的身份以及其与安全性相关的属性(例如密码和加密密钥)。受试者可能具有多个身份。 每个身份在
Principal
内表示为Subject
。 校长只需将名称绑定到一个Subject
。 例如,一个Subject
恰好是一个人,爱丽丝可能有两个校长:一个将“爱丽丝酒吧”(她的驾驶执照上的名称)绑定到Subject
,另一个绑定“999-99-9999” ,她的学生身份证号码,到Subject
。 即使每个人都有不同的名称,两位校长也参考同一个Subject
。A
Subject
还可以拥有与安全相关的属性,这些属性被称为凭证。 需要特殊保护的敏感凭证(如私人加密密钥)存储在私人凭据Set
。 用于共享的凭据,例如公开密钥证书或Kerberos服务器票据存储在公共证书Set
。 需要不同的权限来访问和修改不同的凭据集。要检索与
Subject
相关联的所有主体,请调用getPrincipals
方法。 要检索属于Subject
所有公用或私有凭证,请分别调用getPublicCredentials
方法或getPrivateCredentials
方法。 要修改返回的主体和凭据的Set
,请使用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
是序列化的,但是与Subject
相关联的凭据不是。 请注意,java.security.Principal
类不实现Serializable
。 因此,与主题相关联的所有具体的Principal
实现必须实现Serializable
。- 从以下版本开始:
- 1.4
- 另请参见:
-
Principal
,DomainCombiner
, Serialized Form
-
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 static <T> T
doAs(Subject subject, PrivilegedAction<T> action)
执行工作作为一个特定的Subject
。static <T> T
doAs(Subject subject, PrivilegedExceptionAction<T> action)
执行工作作为一个特定的Subject
。static <T> T
doAsPrivileged(Subject subject, PrivilegedAction<T> action, AccessControlContext acc)
作为特定的Subject
执行特权工作。static <T> T
doAsPrivileged(Subject subject, PrivilegedExceptionAction<T> action, AccessControlContext acc)
作为特定的Subject
执行特权工作。boolean
equals(Object o)
将指定的对象与此Subject
进行比较以获得相等性。Set<Principal>
getPrincipals()
返回Set
与此相关的校长Subject
。<T extends Principal>
Set<T>getPrincipals(Class<T> c)
返回Set
与此关联的PrincipalSubject
是实例或指定的子类Class
。Set<Object>
getPrivateCredentials()
返回此Set
所持有的私有证书的Subject
。<T> Set<T>
getPrivateCredentials(Class<T> c)
返回一个Set
与此相关的私有证书Subject
是实例或指定的子类Class
。Set<Object>
getPublicCredentials()
返回这个Set
所持有的公共证书的Subject
。<T> Set<T>
getPublicCredentials(Class<T> c)
返回一个Set
与此相关的公开证书Subject
是实例或指定的子类Class
。static Subject
getSubject(AccessControlContext acc)
得到Subject
与所提供的相关AccessControlContext
。int
hashCode()
返回此Subject
的哈希Subject
。boolean
isReadOnly()
查询Subject
是否为只读。void
setReadOnly()
将此Subject
设置为只读。String
toString()
返回此Subject
的String表示Subject
。
-
-
-
构造方法详细信息
-
Subject
public Subject()
创建一个Subject
的实例,一个空的Set
的主体和空的公共和私人凭据集。新构造的集合在允许后续修改之前检查此
Subject
是否已设置为只读。 新创建的集合还通过确保呼叫者具有足够的权限来防止非法修改。 这些集合还禁止空元素,并尝试添加或查询空元素将导致一个NullPointerException
。要修改Principals Set,主叫方必须具有
AuthPermission("modifyPrincipals")
。 要修改公用证书集,主叫方必须具有AuthPermission("modifyPublicCredentials")
。 要修改私人凭证集,主叫方必须具有AuthPermission("modifyPrivateCredentials")
。
-
Subject
public Subject(boolean readOnly, Set<? extends Principal> principals, Set<?> pubCredentials, Set<?> privCredentials)
使用主体和凭据创建一个Subject
的实例。来自指定集的主体和凭据将复制到新构造的集合中。 这些新创建的集合在允许后续修改之前检查此
Subject
是否已设置为只读。 新创建的集合还通过确保呼叫者具有足够的权限来防止非法修改。 这些集合还禁止空元素,尝试添加或查询空元素将导致一个NullPointerException
。要修改Principals Set,调用者必须具有
AuthPermission("modifyPrincipals")
。 要修改公用证书集,呼叫者必须具有AuthPermission("modifyPublicCredentials")
。 要修改私人凭证集,主叫方必须具有AuthPermission("modifyPrivateCredentials")
。- 参数
-
readOnly
- 如果Subject
为只读,Subject
true,否则为false。 -
principals
-在Set
校长与此相关Subject
。 -
pubCredentials
-在Set
公开证书与此相关Subject
。 -
privCredentials
-在Set
私有证书与此相关Subject
。 - 异常
-
NullPointerException
-如果指定principals
,pubCredentials
,或privCredentials
是null
,或在任何这三组存在空值。
-
-
方法详细信息
-
setReadOnly
public void setReadOnly()
将此Subject
设置为只读。此主题的修改(添加和删除)
Principal
Set
和凭证集将被禁止。 此主题凭据的destroy
操作仍将被允许。随后尝试修改Subject的
Principal
和凭证集将导致抛出IllegalStateException
。 另外,一旦Subject
是只读,就不能重新设置为可写。- 异常
-
SecurityException
- 如果安装了一个安全管理器,并且主叫方没有一个AuthPermission("setReadOnly")
权限将此Subject
设置为只读。
-
isReadOnly
public boolean isReadOnly()
查询Subject
是否为只读。- 结果
-
如果这个
Subject
是只读的,Subject
true,否则为false。
-
getSubject
public static Subject getSubject(AccessControlContext acc)
得到Subject
与所提供的相关AccessControlContext
。AccessControlContext
可能包含许多主题(来自嵌套的doAs
调用)。 在这种情况下,最近Subject
与相关AccessControlContext
返回。- 参数
-
acc
-AccessControlContext
从中检索Subject
。 - 结果
-
与所提供的
Subject
相关联的AccessControlContext
或null
如果否)Subject
与所提供的AccessControlContext
相关联。 - 异常
-
SecurityException
- 如果安装了一个安全管理器,并且主叫方没有AuthPermission("getSubject")
权限获取Subject
。 -
NullPointerException
- 如果提供的AccessControlContext
是null
。
-
doAs
public static <T> T doAs(Subject subject, PrivilegedAction<T> action)
执行工作作为一个特定的Subject
。此方法首先通过
AccessController.getContext
检索当前线程的AccessControlContext
,然后使用检索到的上下文以及新的SubjectDomainCombiner
(使用提供的Subject
)实例化新的AccessControlContext
。 最后,此方法调用AccessController.doPrivileged
,传递给它提供的PrivilegedAction
以及新构建的AccessControlContext
。- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
subject
-在Subject
指定的action
会运行。 此参数可能为null
。 -
action
- 要运行的代码为指定的Subject
。 - 结果
-
PrivilegedAction的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果PrivilegedAction
是null
。 -
SecurityException
- 如果安装了一个安全管理器,并且调用者没有调用此方法的AuthPermission("doAs")
权限。
-
doAs
public static <T> T doAs(Subject subject, PrivilegedExceptionAction<T> action) throws PrivilegedActionException
执行工作作为一个特定的Subject
。此方法首先通过
AccessController.getContext
检索当前线程的AccessControlContext
,然后使用检索的上下文以及新的SubjectDomainCombiner
(使用提供的Subject
)实例化新的AccessControlContext
。 最后,此方法调用AccessController.doPrivileged
,传递提供的PrivilegedExceptionAction
以及新构建的AccessControlContext
。- 参数类型
-
T
- 由PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
subject
-Subject
指定的action
将作为运行。 此参数可能为null
。 -
action
- 要运行的代码为指定的Subject
。 - 结果
-
由PrivilegedExceptionAction的
run
方法返回的值。 - 异常
-
PrivilegedActionException
- 如果PrivilegedExceptionAction.run
方法抛出一个被检查的异常。 -
NullPointerException
- 如果指定的PrivilegedExceptionAction
是null
。 -
SecurityException
- 如果安装了一个安全管理器,并且调用者没有AuthPermission("doAs")
权限来调用此方法。
-
doAsPrivileged
public static <T> T doAsPrivileged(Subject subject, PrivilegedAction<T> action, AccessControlContext acc)
作为特定的Subject
执行特权工作。此方法的行为与
Subject.doAs
完全相同,不同之处在于,它不是检索当前线程的AccessControlContext
,而是使用提供的AccessControlContext
。 如果提供的AccessControlContext
是null
,则此方法将实例化一个新的AccessControlContext
其中包含一个空集合ProtectionDomains。- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
subject
-Subject
指定的action
将作为运行。 此参数可能为null
。 -
action
- 要运行的代码为指定的Subject
。 -
acc
- 要绑定到指定的 主题和 操作的AccessControlContext
。 - 结果
-
由PrivilegedAction的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果PrivilegedAction
是null
。 -
SecurityException
- 如果安装了一个安全管理器,并且调用者没有AuthPermission("doAsPrivileged")
权限来调用此方法。
-
doAsPrivileged
public static <T> T doAsPrivileged(Subject subject, PrivilegedExceptionAction<T> action, AccessControlContext acc) throws PrivilegedActionException
作为特定的Subject
执行特权工作。此方法的行为与
Subject.doAs
完全相同,不同之处在于,它不是检索当前线程的AccessControlContext
,而是使用提供的AccessControlContext
。 如果提供的AccessControlContext
是null
,则此方法将实例化一个新的AccessControlContext
其中包含一个空集合ProtectionDomains。- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
subject
-在Subject
指定的action
会运行。 此参数可能为null
。 -
action
- 要运行的代码为指定的Subject
。 -
acc
- 要绑定到指定的 主题和 动作的AccessControlContext
。 - 结果
-
由PrivilegedExceptionAction的
run
方法返回的值。 - 异常
-
PrivilegedActionException
- 如果PrivilegedExceptionAction.run
方法抛出一个已检查的异常。 -
NullPointerException
- 如果指定的PrivilegedExceptionAction
是null
。 -
SecurityException
- 如果安装了一个安全管理器,并且调用者没有AuthPermission("doAsPrivileged")
权限来调用此方法。
-
getPrincipals
public Set<Principal> getPrincipals()
返回Set
与此相关的校长Subject
。 每个Principal
代表这个Subject
的身份。返回的
Set
由本主题的内部Principal
Set
。 对所返回的Set
任何修改Set
影响内部Principal
Set
。如果安装了安全管理器,则调用者必须具有
AuthPermission("modifyPrincipals")
权限才能修改返回的集合,否则将抛出一个SecurityException
。- 结果
-
在
Set
与此相关的PrincipalSubject
。
-
getPrincipals
public <T extends Principal> Set<T> getPrincipals(Class<T> c)
返回Set
与此关联的PrincipalSubject
是实例或指定的子类Class
。返回的
Set
不受此主题内部的Principal
Set
。 为每个方法调用创建并返回一个新的Set
。 对返回的Set
修改不会影响内部Principal
Set
。- 参数类型
-
T
- 类型由c
建模 - 参数
-
c
- 返回的Set
的校长都将是这个类的实例。 - 结果
-
一个
Set
的主体是指定的Class
实例。 - 异常
-
NullPointerException
- 如果指定的Class
是null
。
-
getPublicCredentials
public Set<Object> getPublicCredentials()
返回Set
本公开证书Subject
。返回的
Set
由本主题的内部公开凭证Set
。 对所返回的Set
任何修改Set
影响内部公共证书Set
。如果安装了一个安全管理器,则调用者必须具有
AuthPermission("modifyPublicCredentials")
权限才能修改返回的集合,否则将抛出一个SecurityException
。- 结果
-
一个由这个
Subject
持有的Set
的公共证书。
-
getPrivateCredentials
public Set<Object> getPrivateCredentials()
返回此Set
所持有的私有凭证的Subject
。返回的
Set
由本主题的内部私人凭证Set
。 对所返回的Set
任何修改Set
影响内部私人凭据Set
。如果安装了一个安全管理器,调用者必须具有
AuthPermission("modifyPrivateCredentials")
的权限来修改返回的集合,否则将抛出一个SecurityException
。在遍历的
Set
,一个SecurityException
如果安装了安全管理器抛出调用者不具有PrivateCredentialPermission
访问特定凭证。 该Iterator
是先进还是在接下来的元素Set
。- 结果
-
一个
Set
这个私有证书Subject
。
-
getPublicCredentials
public <T> Set<T> getPublicCredentials(Class<T> c)
返回一个Set
与此相关的公开证书Subject
是实例或指定的子类Class
。返回的
Set
不受此Subject的内部公共证书Set
。 为每个方法调用创建并返回一个新的Set
。 对返回的Set
修改不会影响内部公共证书Set
。- 参数类型
-
T
- 由c
建模的类的类型 - 参数
-
c
- 返回的Set
的公用凭证都将是此类的实例。 - 结果
-
一个
Set
的公共凭据是指定的Class
实例。 - 异常
-
NullPointerException
- 如果指定的Class
是null
。
-
getPrivateCredentials
public <T> Set<T> getPrivateCredentials(Class<T> c)
返回一个Set
与此相关的私有证书Subject
是实例或指定的子类Class
。如果安装了安全管理器,则呼叫者必须具有
PrivateCredentialPermission
才能访问所有请求的凭据,否则将抛出一个SecurityException
。返回的
Set
不受此Subject的内部私人凭证Set
。 为每个方法调用创建并返回一个新的Set
。 对返回的Set
修改不会影响内部私人凭据Set
。- 参数类型
-
T
- 类型由c
建模 - 参数
-
c
- 返回的Set
的私有凭证都将是此类的实例。 - 结果
-
一个
Set
的私有凭据是指定的Class
实例。 - 异常
-
NullPointerException
- 如果指定的Class
是null
。
-
equals
public boolean equals(Object o)
将指定的对象与此Subject
进行比较以获得相等性。 如果给定对象也是主题,并且两个Subject
实例是等效的,则返回true。 更正式地,如果Principal
和Credential
集合相等,则两个Subject
实例相等。- 重写:
-
equals
在Object
- 参数
-
o
- 要与此Subject
进行比较的对象。 - 结果
-
如果指定的对象等于此
Subject
。 - 异常
-
SecurityException
- 如果安装了一个安全管理器,并且主叫方没有PrivateCredentialPermission
权限访问该Subject
或所提供的Subject
的私有凭据。 - 另请参见:
-
Object.hashCode()
,HashMap
-
toString
public String toString()
返回此Subject
的字符串表示Subject
。
-
hashCode
public int hashCode()
返回此Subject
的哈希Subject
。- 重写:
-
hashCode
在Object
- 结果
-
这个
Subject
的哈希Subject
。 - 异常
-
SecurityException
- 如果安装了一个安全管理器,并且调用者没有访问该主体的私有凭据的权限, 则为PrivateCredentialPermission
。 - 另请参见:
-
Object.equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
-
-