shiro使用自定义realm实现数据认证

2023-11-16

自定义realm实现数据认证

在开发中,有时会与一些nosql或者其他地方保存的数据进行认证,这时候,shiro定义的那些realm类可能不能满足实际的功能需求,这时候我们可以通过自定义一个realm来沟通这些数据。实现认证和权限控制。

首先自定义一个realm,继承自AuthorizingRealm抽象类,并实现它的两个功能:

package com.yinhai.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 自定义Realm
 */
public class CoustomRealm  extends AuthorizingRealm {
    //做授权管理的
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    //做认证的
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
         //拿到account
        String principal = (String) token.getPrincipal();

        if("zhangsan".equals(principal)){ //模拟在数据库中查找用户名的过程,如果找到有,则将用户名和密码返回,没有直接返回null
            //通过用户名在数据库中拿到正确的密码,我这里直接省略
            String password = "123456";
            //新建一个返回信息返回给manager,manager会根据正确的账户和密码自动匹配用户传递过来的账户和密码,参数3是当前realm的名称,底			    层会自动生成的。
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal, password, this.getName());
            return simpleAuthenticationInfo;
        }


        return null;
    }
}

然后就可以使用这个realm了:

package com.yinhai;

import com.yinhai.realm.CoustomRealm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

/**
 * 使用自定义realm进行认证测试
 */
public class CostumeRealmAuthTest {
    public static void main(String[] args) {
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        securityManager.setRealm(new CoustomRealm());
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken zhangsan = new UsernamePasswordToken("zhangsan", "123456");
        try{
            subject.login(zhangsan);
            System.out.println(subject.isAuthenticated());
        }catch (Exception e){
            e.getMessage();
        }
    }
}

以上是普通的,明文密码匹配方式认证,如果要使用加密的话可以采用以下:

package com.yinhai.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

public class CostumeMD5Realm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //拿到account
        String principal = (String) token.getPrincipal();

        if("zhangsan".equals(principal)){ //模拟在数据库中查找用户名的过程,如果找到有,则将用户名和密码返回,没有直接返回null
            //通过用户名在数据库中拿到正确的密码,我这里直接省略
            String password = "458e4c8450daf785d77e92c6d391e6a2";
            //新建一个返回信息返回给manager,manager会根据正确的账户和密码自动匹配用户传递过来的账户和密码,
            // 参数3是盐加密规则
            // 参数4是当前realm的名称,底层会自动生成的。
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal,
                    password,
                    ByteSource.Util.bytes("07?*xx"),
                    this.getName());
            return simpleAuthenticationInfo;
        }


        return null;
    }
}

使用:

package com.yinhai;

import com.yinhai.realm.CostumeMD5Realm;
import com.yinhai.realm.CoustomRealm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

public class CostumeMD5RealmAuthTest {
    public static void main(String[] args) {
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        CostumeMD5Realm costumeMD5Realm = new CostumeMD5Realm();
        //获取密码匹配器
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        //设置加密方式
        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
        //设置hash散列次数
        hashedCredentialsMatcher.setHashIterations(512);
        //设置自定义realm的密码匹配器
        costumeMD5Realm.setCredentialsMatcher(hashedCredentialsMatcher);

        securityManager.setRealm(costumeMD5Realm);
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken zhangsan = new UsernamePasswordToken("zhangsan", "123456");
        try{
            subject.login(zhangsan);
            System.out.println(subject.isAuthenticated());
        }catch (Exception e){
            e.getMessage();
        }
    }
}

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

shiro使用自定义realm实现数据认证 的相关文章

  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 5g信令流程详解_4G和5G互操作流程详解——5G知识分享

    引言 5G的商用部署进程将是一个基于4G系统进行的长期的替换 升级 迭代的过程 而在5G网络部署的前中期阶段 4G系统也是在5G覆盖不完善的情况下 作为保障用户业务连续性体验这一目的的最好补充 因此4G 5G融合组网 以及互操作技术将是各大
  • python+playwright 学习-35.获取页面的完整 HTML 内容

    前言 selenium 里面有个driver page source 可以获取整个html页面的内容 playwright里面也有类似的方法 使用 page content page content 获取html内容 使用示例 from p
  • 解决在typescript里获取axios返回值报错的问题,Property ‘profile‘ does not exist on type ‘AxiosResponse<any>‘

    如果你是用的vuecli创建的项目 那么请在res文件夹下新建axios d ts文件 添加以下内容 eslint disable no undef eslint disable no unused vars import as axios
  • 使用艺术二维码API接口生成个性化二维码(不会代码也可以)

    目录 前言 介绍 一 申请API接口 二 进行二维码信息的配置 配置后 代码会直接生成 1 基础参数 默认参数 2 进行二维码重要信息配置 2 1二维码类型 2 2二维码内容 2 3绘制指令 3 次要部分 3 1二维码组合 3 2预设背景风
  • 如何使用 ChatGP在TTPU(张量处理单元)上训练模型的指令

    推荐 将NSDT场景编辑器加入你的3D工具链 3D工具集 NSDT简石数字孪生 ChatGPT 作为您的专家助手 ChatGPT 可以帮助我们学习新的编程语言 课程 技术和技能 它已成为许多寻求改进工作流程或学习新事物的专业人士的首选工具
  • Linux中的软件管家——yum

    目录 编辑 一 软件安装的方式 二 对yum的介绍 1 yum的作用 2 yum的库 三 yum下载软件的操作 1 yum list 2 yum install 3 yum remove 四 yum源的转换 一 软件安装的方式 软件安装的方
  • MIT新研发的芯片将神经网络功耗降低95%

    内容来源 ATYUN AI平台 近日 麻省理工学院 MIT 的工程师们设计了一种芯片 这种芯片能将神经网络计算的速度提高3到7倍 同时还能将耗电量降低94 95 这大大减少了在芯片存储器和处理器之间来回传输数据的需要 这可能使得我们可以在智
  • 小样本图像分类研究综述

    https kns cnki net kcms2 article abstract v 3uoqIhG8C44YLTlOAiTRKibYlV5Vjs7ioT0BO4yQ4m mOgeS2ml3UDKtyAQtTA0dGC TDvW fPi0
  • 华为OD机试真题 Java 实现【完美走位】【2022.11 Q4】

    题目描述 输入一个长度为4的倍数的字符串 字符串中仅包含WASD四个字母 将这个字符串中的连续子串用同等长度的仅包含WASD的字符串替换 如果替换后整个字符串中WASD四个字母出现的频数相同 那么我们称替换后的字符串是 完美走位 求子串的最
  • vue+播放直播视频流(websocket的流文件)

    前言 之前分享的有 rtmp直播流 flv直播流的一些方法 这里分享下 播放 websocket的直流的方法 使用的方法是JSMpeg JSMpeg是JS写的视频 音频解码器 能使用WebGL Canvas2D渲染以及WebAudio声音输
  • Linux14.04下安装网易云音乐和搜狗输入法(太棒了!!!)

    本文转载于 http blog csdn net tao 627 article details 51535294 注 本人比较喜欢挺音乐 一直用的是Linux版本 一直苦苦的用着网页版的网易云音乐 哎呀 反正不太好 不舒服 今天由于其他原
  • React 从零开始学习(一) —— 搭建项目

    React 文档地址 https react docschina org docs create a new react app html 简介 React 是一个用于构建用户界面的 JAVASCRIPT 库 React 主要用于构建 UI
  • 如何通过JAVA代码实现多线程分段下载+断点续传

    多线程下载技术是很常见的一种下载方案 这种方式充分利用了多线程的优势 在同一时间段内通过多个线程发起下载请求 将需要下载的数据分割成多个部分 每一个线程只负责下载其中一个部分 然后将下载后的数据组装成完整的数据文件 这样便大大加快了下载效率
  • matplotlib.pyplot.plot()参数详解

    https matplotlib org api pyplot summary html 在交互环境中查看帮助文档 import matplotlib pyplot as plt help plt plot 以下是对帮助文档重要部分的翻译
  • CloudCompare——计算点云的法向量

    目录 1 Computing normals on a cloud 2 点云法线计算结果 3 反转法线方向 Normals gt Invert 4 With Minimum Spanning Tree 5 With Fast Marchin
  • AutoCAD 二次开发之 ObjectARX 环境搭建

    AutoCAD2017 VS2015 Win7 Win10 第一步 安装ObjectARX SDK 库 解压 ObjectARX SDK 文件到指定路径 C ObjectARX 避免出错 使用默认路径 第二步 安装向导程序 创建注册表 新建
  • 使用JestClient连接elasticsearch-5.x对数据进行分组聚合

    原本数据存放在mysql中 项目需求是从mysql中查出来计算推送给前端 但是随着数据量增大 我们的查询语句也复杂 性能会明显下降 所以就考虑干脆存放到elasticsearch中 查询计算都方便 于是去和公司专门负责es平台服务的人对接
  • IT项目管理大作业-个人报告

    在本次IT项目管理大作业中我主要负责了寻找对应模块和工具的工作 主要职责就是负责百度搜索 为开发人员和测试人员提供支持 虽然在本次大作业的实际执行中 由于我实习白天确实很忙外加团队开发人员都有很强的开发能力 因此基本上开发人员和测试人员还是
  • JAVA和C++区别都有哪些?

    转载自品略图书馆 http www pinlue com article 2020 05 1022 4710469487040 html 这是Java与C 区别的一个比较完整的答案 大家可以学习一下 JAVA和C 都是面向对象语言 也就是说
  • shiro使用自定义realm实现数据认证

    自定义realm实现数据认证 在开发中 有时会与一些nosql或者其他地方保存的数据进行认证 这时候 shiro定义的那些realm类可能不能满足实际的功能需求 这时候我们可以通过自定义一个realm来沟通这些数据 实现认证和权限控制 首先