将 Shiro 的 PasswordMatcher 与自定义领域结合使用

2023-12-09

我使用 Apache Shiro 和自定义 JDBC 领域来从数据库中检索用户的盐、密码、哈希算法名称和哈希迭代次数,这些数据都存储为单独的列。

问题是我不确定在使用 PasswordMatcher 验证用户密码与数据库中存储的密码是否匹配时应该如何处理从数据库检索到的盐。

当使用 HashedCredentialsMatcher 时,盐是使用setCredentialsSalt方法,但是当使用 PasswordMatcher 而不是 HashedCredentialsMatcher 时,情况似乎并非如此。

我在自定义 JDBC 领域中使用的代码如下

@Override 
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 

        //code to retrieve user details from database removed for brevity 

        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, passwdSalt.password, getName()); 
        info.setCredentialsSalt(new SimpleByteSource(passwdSalt.salt)); 

        DefaultPasswordService passwordService = new DefaultPasswordService(); 
        DefaultHashService hashService = new DefaultHashService(); 
        PasswordMatcher passwordMatcher = new PasswordMatcher(); 

        hashService.setHashAlgorithmName(passwdSalt.hashAlgorithmName); 
        hashService.setHashIterations(passwdSalt.hashIterations); 
        passwordService.setHashService(hashService); 
        passwordMatcher.setPasswordService(passwordService); 
        setCredentialsMatcher(passwordMatcher); 

        return info; 
} 

在逐步完成代码后,我确认问题肯定是由于在对用户输入的密码进行哈希处理以便将其与数据库中的哈希密码进行匹配时未使用盐造成的。在 DefaultPasswordService.java 中,当第 160 行调用passwordsMatch(Object SubmittedPlaintext, String saving) 方法时,名为的对象request包含以下内容

algorithmName=null 
iterations=0 
salt=null 
source=cGFzc3dvcmQ= 

第 161 行的下一行代码调用computeHash(request)

在DefaultHashService.java的时候该方法computeHash(HashRequest request)被调用,第 155 行和第 157 行变量algorithmName 和iterations 被正确设置为SHA-256 and 1分别。第 159 行方法getPublicSalt(request)被调用但返回 null。

有没有其他人使用 Shiro 的 PasswordMatcher 与自定义领域,如果你如何告诉 Shiro 使用盐?


我在 Shiro 邮件列表上发布了一条消息,并收到回复说,默认情况下,PasswordMatcher 不会查看 AuthenticationInfo 中除authenticationInfo.getCredentials() 之外的任何内容。

有关更多详细信息,请访问邮件列表上的存档消息:http://shiro-user.582556.n2.nabble.com/Migration-from-HashedCredentialMatcher-to-PasswordMatcher-td7577808.html

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

将 Shiro 的 PasswordMatcher 与自定义领域结合使用 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐

  • 从一个表中获取另一表中没有记录的记录

    SURVEYS table SurveyID UserID Question Choice1 Choice2 Choice3 RESPONSES table UserID SurveyID Answer 第一个愿望 已实现 显示用户 28
  • iOS 7:如何仅允许 VC 纵向[重复]

    这个问题在这里已经有答案了 我的所有项目都允许以横向 纵向模式查看应用程序 但对于一个视图控制器 我想禁用此功能并仅以纵向显示它 我努力了shouldAutorotate and supportedInterfaceOrientations
  • 如何从 Struts 2 中选定的对象中获取对象属性

    我有一个清单City对象与name and id字段 我使用 Struts2 并且有一个带有 select 标签的 jsp 页面
  • 在 CodeIgniter 中安装omnipay 时出错

    我正在尝试在 CodeIgniter 版本 2 2 4 中添加omnipay 我按照使用此链接安装作曲家的说明进行操作 https philsturgeon uk blog 2012 05 composer with codeigniter
  • 如何限制 Google App Engine 的 Python 版本中特定方法的允许执行时间?

    由于 Google App Engine 的 python 版本不支持信号模块 如果方法在 2 秒内未返回 则调用方法并抛出 捕获异常的最简单方法是什么 如果您正在谈论 RPC 调用 例如数据存储 您可以创建一个带有截止日期的 RPC 请参
  • 在编写使用经销商 API 的应用程序时,我是否需要使用我的经销商域?

    我是 Google Apps 经销商 希望使用 Google API 例如Google Apps 转销商 API自动化我的经销商活动 当我注册成为 Google Apps 经销商时 我获得了一个新的 Google Apps 域 resell
  • 如何在编译时使用不同的接口声明而不混淆 Interface Builder

    例如 如果我的应用程序有多个版本 付费版本和免费版本 并且我希望根据哪个版本拥有不同的界面 那么 Interface Builder 似乎会感到困惑 例如 MyViewController h ifdef FREE interface My
  • Hive 连接优化

    我有两组数据都存储在 S3 存储桶中 我需要在 Hive 中处理这些数据并将输出存储回 S3 每个数据集的示例行如下 DataSet 1 requestId TADS6152JHGJH5435 customerId ASJHAGSJH se
  • 使用cat函数写入csv文件

    我需要使用 cat 函数向 CSV 添加新行 请你们帮帮我好吗 我对 R 的了解有限 这是文件 name1 csv 系统要求我将我的姓名和学生 ID 添加到前几行 homework1 lt data frame homework1 Tota
  • 将多个项目添加到列表中

    static class Program static void Main string carMake string carModel string carColour string bikeModel string bikeMake s
  • 添加边框时 CSS Div 跳转

    我不明白为什么当我将鼠标悬停在第一个框 左上角 上时 框会发生变化 我已将 box sizing 设置为 border box 因此悬停时添加的边框不会产生影响 并且它只发生在第一个框上 请帮忙 JS小提琴here box sizing b
  • AngularJS 中防止 IE 缓存的更好方法?

    我目前使用 service resource 进行 ajax 调用 在本例中为 GET 并且 IE 缓存这些调用 以便无法从服务器检索新数据 我使用了通过谷歌搜索找到的一种技术来创建一个随机数并将其附加到请求中 这样 IE 就不会去缓存数据
  • mc:edit 不适用于具有 Mandrill Javascript API 的 Mailchimp 模板

    我正在尝试使用 Mailchimp 模板通过 Mandrill API 发送电子邮件 我正在使用 Parse com 在云代码中执行此操作 请参阅此处https www parse com docs cloud modules guide
  • React Native TypeError:网络请求因 fetch() 失败

    我正在使用 React Native 来开发 Android 应用程序 通过此获取请求 我收到错误TypeError network request failed fetch https pixabay com api key MY KEY
  • R 中的自动虚拟变量

    我有以下创建的数据框 temp lt as data frame with uadm table prlo state code 我希望创建 11 个虚拟变量 前 10 名各一个 其他 一个 可以通过以下方式轻松找到前 10 名 top10
  • R过滤器包含子字符串多个条件

    嘿 我有一个 500K 行的列表 我需要按条件进行过滤 其中必须包含某些子字符串 另一个包含 20 个子字符串的列表 我在用dplyr现在打包 我的代码如下所示 result lt data gt filter grepl sub1 col
  • Java邮件与土耳其字符的问题

    我在使用 Java 代码发送的邮件中显示土耳其语字符时遇到问题 这些字符在邮件中显示为问号 Message msg new MimeMessage mailSession msg setHeader Content Encoding ISO
  • SetWindowsHookEx 全局键盘挂钩未捕获所有按键

    我正在编写属于自动化系统一部分的代码 我想添加一个键盘钩子来提前结束测试 我通过使用 SetWindowHookEx 来做到这一点 我的代码看起来很像这样 http support microsoft com kb 318804 这是我的
  • 全局变量值不可在多个函数中使用

    使用 Google Apps 脚本 我尝试创建一个可在多个函数中使用的全局变量 例如数组 但我似乎无法在任何地方找到答案 我需要它才能使我的 Google 电子表格正常工作 Code var infoSheetArray null func
  • 将 Shiro 的 PasswordMatcher 与自定义领域结合使用

    我使用 Apache Shiro 和自定义 JDBC 领域来从数据库中检索用户的盐 密码 哈希算法名称和哈希迭代次数 这些数据都存储为单独的列 问题是我不确定在使用 PasswordMatcher 验证用户密码与数据库中存储的密码是否匹配时