有关Shiro中Principal的使用

1、定义

principal代表什么那?如果阅读官方文档或者源码你会得到如下的定义:

有关Shiro中Principal的使用_第1张图片

解释:
1)可以是uuid
2)数据库中的主键
3)LDAP UUID或静态DN
4)在所有用户帐户中唯一的字符串用户名。

也就是说这个值必须是唯一的。也可以是邮箱、身份证等值。

1、用法
有关Shiro中Principal的使用_第2张图片

进入其构造方法

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 list = new ArrayList<>();
        list.add(admin.getName());
        list.add(admin.getId());
        list.add(admin.getEmail());
        list.add(admin.getPsd());
        return new SimpleAuthenticationInfo(list, admin.getPsd(), this.getClass().getName()); 
  
<span class="hidden-xs"><shiro:principal/>span>

这样就能拿到用户名。

你可能感兴趣的:(other)