有关Shiro中Principal的使用
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的使用相关推荐
- Shiro中principal和credential的区别
principal:能唯一标识用户身份的属性,一个主题(用户)可以有多个principal: 举个例子:你去登录一些网站时可以用用户名,也可以用手机或邮箱,这些principal是别人可以知道的: c ...
- 动态改变shiro的Principal属性
因为要保存一些用户名之外的内容在shiro中,所以创建了一个ShiroUser的类,当用户修改了某些属性后,如何动态保存到shiro中: Subject subject = SecurityUtils ...
- redis-shiro session 共享subject中principal 为空
redis-shiro session共享,登陆后subject中principal 为空 看过我的上一篇文章 redis-shiro session共享,序列化大坑的人,你可能遇到一个新的问题,就是 ...
- 【转】解决shiro的Principal属性动态修改无效问题
原文转载自:https://www.cnblogs.com/exmyth/p/13261860.html 因为要保存一些用户名之外的内容在shiro中,所以创建了一个ShiroUser的类,当用户修改 ...
- shiro集成 spring-加密md5配置--权限管理-shiro中的session 等等!!
目录 1.shiro集成 spring 1.1 导入依赖的包 1.2 web.xml配置 2. 开发自定义Realm 2.1 创建测试数据表 2.3 编写后台支持服务 2.4 编写自定义的Realm ...
- shiro中的验证用户身份认证以及授权
目录 1.运用shiro进行用户身份认证: 1.1导入基于Shiro的数据库脚本 1.2.引入依赖(shiro-1.4.1) shiro-core shiro-web shiro-spring 1 ...
- Shiro中进行角色与权限认证流程
场景 使用Shiro的JdbcRealm实现查询数据库进行身份认证: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/9010599 ...
- 学习Spring Boot:(十九)Shiro 中使用缓存
前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...
- Shiro系列-Shiro中Realm如何使用
导语 之前的分享中,了解到了用户身份认证,在说用户认证的时候提到了一个概念就是Realm,在之前的入门分享中提到了,Realm其实就是一个安全数据源,那么怎么样使用这个安全数据源呢?下面就来一起研 ...
最新文章
- 【深度学习】CNN在大规模图像数据集上的应用(基于keras和MNIST)
- Linux下使用g++编译C++程序——Compiling Cpp
- 用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API
- python3环境搭建odoo_【环境配置】ubuntu16.04配置odoo13环境
- python webdriver脚本例子_Selenium webdriver添加cookie实现过程详解
- vr的延迟和渲染效率优化与Nvidia VRWorks
- Linux系统管理(6)——Linux下启动Redis服务的几种方法
- configure: error: Can‘t find ext2fs library
- 求2020 CFA二级notes资源,谢谢!
- UEstudio 注册机使用教程
- wdr7660虚拟服务器设置,TP-LINK WDR7660用手机怎么设置?
- 快递员上门取件api接口技术对接java文档
- NPN三极管放大原理
- 爬虫常见的加密解密算法
- 卧槽!Pdf转Word用Python轻松搞定!
- ATECC508A芯片开发笔记(八):ECDH算法配置方法、执行过程及实现原理
- 邮政社招笔试题库_中国邮政招聘考试试题及答案--总括版
- Unity 将经纬度变为Unity中的坐标
- 用Python绘制分子结构
- VBA 常用代码 - 01