有关Shiro中Principal的使用

2023-05-16

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 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<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>

这样就能拿到用户名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有关Shiro中Principal的使用 的相关文章

  • spring集成shiro详解

    最近项目中要用到shiro作为权限管理 以前都是用自定义的或者spring security 所以就开始看了一些网上的文章 但是感觉都写得很零散 而且大多数都只是给了几行代码 我们得项目相对比较复杂 需要进行一些额外得改造和扩展 所以自己也
  • Apache Shiro(三)——Spring Boot 与 Shiro的 整合

    在了解了Apache Shiro的架构 认证 授权之后 我们来看一下Shiro与Web的整合 下面以Spring Boot为例 介绍一下Spring Boot 与 Shiro的 整合 一 创建一个Spring Boot项目 可以使用IDEA
  • Shiro权限框架-限制密码重试次数(8)

    1 实现原理 保证原子性 单系统 AtomicLong计数 集群系统 RedissionClient提供的RAtomicLong计数 1 获取系统中是否已有登录次数缓存 缓存对象结构预期为 用户名 登录次数 2 如果之前没有登录缓存 则创建
  • shiro SecurityManager简介说明

    转自 shiro SecurityManager简介说明 下文笔者讲述Shiro SecurityManager的相关简介说明 如下所示 SecurityManager是Shiro框架的核心 典型的Facade模式 Shiro通过Secur
  • Java面试题--shiro

    Shiro可以做哪些工作 Shiro可以帮助我们完成 认证 授权 加密 会话管理 与Web集成 缓存等 shiro有哪些组件 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权
  • 自定义实现OAuth2.0 授权码模式

    文章目录 OAuth2 0 授权码模式 实践 依赖知识 术语 授权码流程 认证服务器 拉起请求用户授权页面 用户手动授权 提交授权 生成code 下发Token 第三方应用 收到code并请求Token 访问受保护的资源 项目结构 Tomc
  • 用户登录的详细流程(二)JWT生成token登录

    JWT生成token登录 1 jwt的构成 1 header 2 payload 3 signature 2 token的登陆原理 3 在实际中如何应用token 1 设置token的生成代码 2 如何从token中获取有用的信息 3 验证
  • Springboot2(23)轻松整合shiro(带验证码)

    源码地址 springboot2教程系列 Shiro配置 1 Spring集成Shiro一般通过xml配置 SpringBoot集成Shiro一般通过java代码配合 Configuration和 Bean配置 2 Shiro的核心通过过滤
  • shiro实现基于redis的sessionDao

    shiro实现基于redis的sessionDao 将session持久化到数据库的一个关键步骤是对session对象的序列化和反序列化操作 另外在使用redis保存session时一定要设置过期时间 或在编码中检查过期并及时删除缓存 否则
  • springboot整合shiro相关依赖和配置整理

    springboot整合shiro 一 shiro快速开始 去github下载shiro 找到samples quickstart文件夹 用idea打开它 点进shiro ini文件 这个时候idea会提示下载插件 下载它 二 新建一个sp
  • Shiro JndiLdapRealm 针对 LDAP 的授权

    The Shiro 类 JndiLdapRealm 的 JavaDoc明确表示默认情况下禁用授权 并且用户应通过子类化和覆盖 LDAP 服务器来实现授权JndiLdapRealm doGetAuthorizationInfo方法 是否有示例
  • Apache Shiro JdbcRealm 与 JavaConfig 和 Spring Boot

    我正在尝试配置我的 Spring Boot 应用程序以使用 Apache Shiro 作为其安全框架 我已经完成了与 PropertiesRealm 一起使用的所有操作 现在我正在尝试使其与 JdbcRealm 和 Spring Boot
  • Spring MongoDB 和 Apache Shiro

    我正在尝试将 Apache Shiro 与 Spring 和 MongoDB 结合使用 我正在使用自动连接的 Spring 数据存储库 我为 Shiro 创建了自己的自定义领域 它使用 Spring 数据存储库与 Mongo 进行通信 pu
  • 我应该如何检查用户是否在 MVC5 中经过身份验证?

    我见过以下两个可访问的布尔值 System Web Mvc Controller User Identity IsAuthenticated System Web Mvc Controller Request IsAuthenticated
  • Spring 3 MVC Controller集成测试-将Principal注入到方法中

    作为 Spring 3 MVC 的一部分 可以将当前登录的用户 原理 对象注入到控制器方法中 E g Controller public class MyController RequestMapping value update meth
  • Shiro 向 DefaultSecurityManager 抱怨“没有 id xxx 的会话”

    我在一个长期运行的应用程序中使用 Apache Shiro 1 2 0 该应用程序从队列中读取消息并采取操作 所采取的操作需要 Shiro 进行身份验证的会话 因此我实现了一个 ActAsAuthenticationToken 和自定义凭据
  • 如何将已通过身份验证的用户从登录页面重定向到主页

    我正在使用 Apache Shiro 开发 JSF 应用程序 我使用 Shiro 验证用户并将她重定向到主页 这没有问题 身份验证后 当我尝试访问登录页面时 它不会将我重定向到主页 即使已经有登录的用户 我也可以再次登录 我正在做程序化登录
  • 配置 shiro.ini 以进行 JDBC 连接

    作为我新的一年学习新技术计划的一部分 我开始尝试使用 Apache Shiro 安全框架 我设法让基本示例正常工作 该示例将用户名 密码和角色存储在 shiro ini 文件中 但是当我修改 shiro ini 文件以使用 JDBC 时 它
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie
  • WCF 服务 - 自定义主体

    在 WCF 服务类的构造函数中 我将当前主体设置为消息头中传递的主体的主体 Thread CurrentPrincipal OperationContext Current IncomingMessageHeaders GetHeader

随机推荐

  • Docker

    学习笔记 一 Docker概述 1 基本介绍 Docker是一个开源的应用容器引擎 xff0c 基于Go语言 xff0c 并遵从apache2 0协议开源 docker可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 xff
  • roslaunch 时出现resource 找不到的问题

    Resource not found roslaunch ROS path 0 61 opt ros noetic share ros ROS path 1 61 opt ros noetic share The traceback for
  • Linux多线程编程

    在传统的 UNIX 模型中 xff0c 当一个进程需要另一个实体来完成某事 xff0c 它就 fork 一个子进程并让子进程去处理 但是 fork 的调用有如下缺点 xff1a xff08 1 xff09 fork 的 代价是 昂贵的 fo
  • 控制工程实践(13)——滤波器的实现(之二)

    2 中值滤波算法 中值滤波算法 xff0c 通俗讲 xff0c 就是取一组数据的中间大小的值 运算过程 xff1a 对某一参数连续采样N次 xff0c 为方便选取 xff0c N设为奇数 xff1b 把N个采样值从小到大排序 xff1b 取
  • 控制工程实践(14)——滤波器的实现(之三)

    4 加权平均滤波算法 算术平均滤波算法 有平滑度和灵敏度的取舍矛盾 xff1a 取样信号个数小时 xff0c 灵敏度高 xff0c 但平滑度低 xff1b 取样信号个数大时 xff0c 平滑度高 xff0c 但灵敏度低 为了协调二者矛盾 x
  • 信号与系统 基础知识点整理 03(文末可下载PDF格式)

    接着前面的继续 xff1a 信号与系统 passage three Written 8 March 2022 Edited by Wang Ximing 一 xff08 信号的分解 xff09 xff08 1 xff09 直流分量与交流分量
  • mac系统如何生成SSH key与GitHub通信

    一 检查 SSH key 是否存在 在终端输入 xff1a ls al ssh 如果没有 xff0c 终端显示如下 xff1a No such file or directory 如果已经存在 xff0c 则会显示 id rsa 和 id
  • ROS-Industrial 硬件支持

    ROS Industrial硬件支持 ROS Industrial程序的目标是为许多不同种类的工业设备提供ROS接口 xff0c 包括PLC xff0c 机器人控制器 xff0c Servos xff0c 人机界面 工业机器人 下表总结了各
  • ROS依赖包查找安装

    当下载某个功能包到自己的空间 xff0c 在编译时 xff0c 出现依赖项有问题 xff0c 解决如下 xff1a roscd package name rosdep update rosdep package name rosdep即可安
  • 在Windows上使用ROS软件包

    1 二进制安装 如果有ROS软件包的二进制发行版 xff0c 可以使用Chocolatey安装 choco install ros melodic lt package name gt ROS软件包查询 https index ros or
  • EKF扩展卡尔曼滤波器 - CTRV运动模型 及其代码实现

    本文参考了Adam大佬的帖子 https blog csdn net AdamShan article details 78265754 原贴的公式有一点点错误 xff0c 这里已经修正了 xff0c 并给出了代码实现 CTRV模型 我们通
  • 安卓SDK和API是什么意思?

    安卓SDK和API是什么意思 xff1f 一 SDK SDK就是kit xff0c 通俗讲就是工具箱 一系列的工具组合在一起 xff0c 能实现补全代码 自动错误检查之类的功能 xff0c 比如点一下run xff0c 会调用编译器来自动编
  • 3D视觉(五):对极几何和三角测量

    3D视觉 五 xff1a 对极几何和三角测量 对极几何 xff08 Epipolar Geometry xff09 描述的是两幅视图之间的内在射影关系 xff0c 与外部场景无关 xff0c 只依赖于摄像机内参数和这两幅试图之间的的相对姿态
  • 关于产品的一些思考——写在前面的话

    自己是一个十足的Geek xff0c 喜欢使用各种新奇的东西 xff0c 包括软件 硬件 技术 xff0c 又因为自己一点点轻微的强迫症和完美主义 xff0c 在这个过程中总会有自己的一些思考 xff0c 又因为技术出身 xff0c 总会考
  • mybatis映射文件mapper.xml的写法。

    在学习mybatis的时候我们通常会在映射文件这样写 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt DOCTYPE mapper PUBLIC 34 myba
  • layer的弹出层的简单的例子

    如果不了级的基本的清楚官网查看api网址为 http layer layui com 我用的是iframe 如果是iframe层 layer open type 2 content 39 http sentsin com 39 这里cont
  • 左链接Column 'id' in field list is ambiguous

    如题错误如左链接Column 39 id 39 in field list is ambiguous 今天在写sm的时候 xff0c 用到两个表的联合查询出现的如下的错误 xff0c 仔细查找才发现原来两个表的id重复了 xff0c use
  • 我所理解的人工智能

    很多人容易把人工智能理解为机器人 机器人是人工智能的一个实际体现 人工智能应用很广泛 下面我来谈谈我的理解 人工智能可分开理解为 人工 和 智能 xff0c 即人类创造出来的智能 xff0c 从广义上来讲只要人类创造出来 xff0c 能为人
  • maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...

    1 我的项目结构是一个父项目 xff0c 多个子项目目录如下 xff1a 2 我这里就举个例子 xff0c 所以应用的也就是core和domain这两个项目 3 两个项目都继承父项目 4 在模块中domain依赖于core xff0c 在c
  • 有关Shiro中Principal的使用

    1 定义 principal代表什么那 xff1f 如果阅读官方文档或者源码你会得到如下的定义 xff1a 解释 xff1a 1 xff09 可以是uuid 2 xff09 数据库中的主键 3 xff09 LDAP UUID或静态DN 4