Principal 只是 Java SE 6 的旧接口。
由于所有接口都没有默认实现它很简单 定义了一些方法 需要由实现该接口的类实现。
这些方法是
boolean equals(Object another)
Compares this principal to the specified object.
String getName()
Returns the name of this principal.
int hashCode()
Returns a hashcode for this principal.
String toString()
Returns a string representation of this principal.
正如Java Doc 所说:
这个接口代表了一个主体的抽象概念,
可用于表示任何实体,例如个人、
公司和登录 ID。
简单来说,它只是用来让实现者必须以一种使实体在其他实体之间唯一区分的方式来实现这个接口。此外,getName() 必须返回一个值,通过该值唯一标识一个特定实体并且不会与其他实体发生冲突。
因此,如果使用的Principal 是UserDetails 类型,那么Principal 的getName() 将返回UserName 的UserName。
如果我们看到 Spring 用于 AbstractAuthenticationToken.class 的实现:
public String getName() {
if (this.getPrincipal() instanceof UserDetails) {
return ((UserDetails)this.getPrincipal()).getUsername();
} else if (this.getPrincipal() instanceof AuthenticatedPrincipal) {
return ((AuthenticatedPrincipal)this.getPrincipal()).getName();
} else if (this.getPrincipal() instanceof Principal) {
return ((Principal)this.getPrincipal()).getName();
} else {
return this.getPrincipal() == null ? "" : this.getPrincipal().toString();
}
}
另外值得一提的是:
abstract class AbstractAuthenticationToken implements Authentication 和
interface Authentication extends Principal
Principal 接口还确保实现者将实现 equals() 和 hashCode() 这很有意义,因为代表组织或公司或个人的 Principal 实体必须有某种方式与其他实体进行比较.