1、定义

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

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

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

1、用法

进入其构造方法

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 outObject principal;if (type == null) {principal = getSubject().getPrincipal();} else {principal = getPrincipalFromClassName();}// Get the string value of the principalif (principal != null) {if (property == null) {strValue = principal.toString();} else {strValue = getPrincipalProperty(principal, property);}}}// Print out the principal value if not nullif (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<Object> 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>

这样就能拿到用户名。

有关Shiro中Principal的使用相关推荐

  1. Shiro中principal和credential的区别

    principal:能唯一标识用户身份的属性,一个主题(用户)可以有多个principal: 举个例子:你去登录一些网站时可以用用户名,也可以用手机或邮箱,这些principal是别人可以知道的: c ...

  2. 动态改变shiro的Principal属性

    因为要保存一些用户名之外的内容在shiro中,所以创建了一个ShiroUser的类,当用户修改了某些属性后,如何动态保存到shiro中: Subject subject = SecurityUtils ...

  3. redis-shiro session 共享subject中principal 为空

    redis-shiro session共享,登陆后subject中principal 为空 看过我的上一篇文章 redis-shiro session共享,序列化大坑的人,你可能遇到一个新的问题,就是 ...

  4. 【转】解决shiro的Principal属性动态修改无效问题

    原文转载自:https://www.cnblogs.com/exmyth/p/13261860.html 因为要保存一些用户名之外的内容在shiro中,所以创建了一个ShiroUser的类,当用户修改 ...

  5. shiro集成 spring-加密md5配置--权限管理-shiro中的session 等等!!

    目录 1.shiro集成 spring 1.1 导入依赖的包 1.2 web.xml配置 2. 开发自定义Realm 2.1 创建测试数据表 2.3 编写后台支持服务 2.4 编写自定义的Realm ...

  6. shiro中的验证用户身份认证以及授权

    目录 1.运用shiro进行用户身份认证: 1.1导入基于Shiro的数据库脚本 1.2.引入依赖(shiro-1.4.1) shiro-core  shiro-web  shiro-spring 1 ...

  7. Shiro中进行角色与权限认证流程

    场景 使用Shiro的JdbcRealm实现查询数据库进行身份认证: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/9010599 ...

  8. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

  9. Shiro系列-Shiro中Realm如何使用

    导语   之前的分享中,了解到了用户身份认证,在说用户认证的时候提到了一个概念就是Realm,在之前的入门分享中提到了,Realm其实就是一个安全数据源,那么怎么样使用这个安全数据源呢?下面就来一起研 ...

最新文章

  1. 【深度学习】CNN在大规模图像数据集上的应用(基于keras和MNIST)
  2. Linux下使用g++编译C++程序——Compiling Cpp
  3. 用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API
  4. python3环境搭建odoo_【环境配置】ubuntu16.04配置odoo13环境
  5. python webdriver脚本例子_Selenium webdriver添加cookie实现过程详解
  6. vr的延迟和渲染效率优化与Nvidia VRWorks
  7. Linux系统管理(6)——Linux下启动Redis服务的几种方法
  8. configure: error: Can‘t find ext2fs library
  9. 求2020 CFA二级notes资源,谢谢!
  10. UEstudio 注册机使用教程
  11. wdr7660虚拟服务器设置,TP-LINK WDR7660用手机怎么设置?
  12. 快递员上门取件api接口技术对接java文档
  13. NPN三极管放大原理
  14. 爬虫常见的加密解密算法
  15. 卧槽!Pdf转Word用Python轻松搞定!
  16. ATECC508A芯片开发笔记(八):ECDH算法配置方法、执行过程及实现原理
  17. 邮政社招笔试题库_中国邮政招聘考试试题及答案--总括版
  18. Unity 将经纬度变为Unity中的坐标
  19. 用Python绘制分子结构
  20. VBA 常用代码 - 01

热门文章

  1. OpenMP: OpenMP嵌套并行
  2. C++ define的用法
  3. HDU 2708.Vertical Histogram
  4. redis哨兵模式出现connected_slaves:0解决办法
  5. 一个 npm 包的坎坷“续命”之生
  6. 【NLP】NLP中的对抗训练
  7. 整理了643个计算机夏令营预推免招生项目,特点如下:
  8. springboot easyexcel导出百万数据优化
  9. 在线IPv4转换为IPV6,IPV6转为IPV4的工具
  10. 在线免费完整PDF转PPT格式