1、定义
principal代表什么那?如果阅读官方文档或者源码你会得到如下的定义:
解释:
1)可以是uuid
2)数据库中的主键
3)LDAP UUID或静态DN
4)在所有用户帐户中唯一的字符串用户名。
也就是说这个值必须是唯一的。也可以是邮箱、身份证等值。
进入其构造方法
public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName) {
this.principals = new SimplePrincipalCollection(principal, realmName);
this.credentials = credentials;
}
发现principal是为object类型的,也就是说它可以接受所有的对象,
this.principals = new SimplePrincipalCollection(principal, realmName);
是把principal添加到对应的集合中。添加的过程首先判断是否为Collection类型如果是就以添加集合的方式添加,如果不是就添加单个对象。
2、使用标签取出
处理标签的类主要是PrincipalTag进去我们住要看onDoStartTag()
public int onDoStartTag() throws JspException {
String strValue = null;
if (getSubject() != null) {
// Get the principal to print out
Object principal;
if (type == null) {
principal = getSubject().getPrincipal();
} else {
principal = getPrincipalFromClassName();
}
// Get the string value of the principal
if (principal != null) {
if (property == null) {
strValue = principal.toString();
} else {
strValue = getPrincipalProperty(principal, property);
}
}
}
// Print out the principal value if not null
if (strValue != null) {
try {
pageContext.getOut().write(strValue);
} catch (IOException e) {
throw new JspTagException("Error writing [" + strValue + "] to JSP.", e);
}
}
return SKIP_BODY;
}
1)先判断subject是否为空,如果为空直接抛出异常
throw new JspTagException("Error writing [" + strValue + "] to JSP.", e);
2)如果不为空判断type属性是否为空,如果为空那么以迭代的方式得到当前Principal集合的第一个值
principal = getSubject().getPrincipal();
进入内部
public Object getPrincipal() {
return getPrimaryPrincipal(getPrincipals());
}
继续跟进
private Object getPrimaryPrincipal(PrincipalCollection principals) {
if (!isEmpty(principals)) {
return principals.getPrimaryPrincipal();
}
return null;
}
再继续
public Object getPrimaryPrincipal() {
if (isEmpty()) {
return null;
}
return iterator().next();
}
3)如果不为空得到指定类型的Principal 这里久不继续跟进方法了。
principal = getPrincipalFromClassName();
4)接下来判读属性是否为空,如果为空,返回Principal的tostring()
strValue = principal.toString();
5)如果不为空,先把Principal转化为指定的对象,然后再根据属性来取值
strValue = getPrincipalProperty(principal, property);
3、使用例子
List
<span class="hidden-xs"><shiro:principal/>span>
这样就能拿到用户名。