问题 使用JDBCRealm使用Shiro对用户进行身份验证


我正在尝试使用Shiro验证在Tomcat 6中运行的servlet。

我有以下shiro.ini文件:

[main]
ps = org.apache.shiro.authc.credential.DefaultPasswordService
pm = org.apache.shiro.authc.credential.PasswordMatcher
pm.passwordService = $ps

aa = org.apache.shiro.authc.credential.AllowAllCredentialsMatcher
sm = org.apache.shiro.authc.credential.SimpleCredentialsMatcher

jof = org.apache.shiro.jndi.JndiObjectFactory
jof.resourceName = jdbc/UserDB
jof.requiredType = javax.sql.DataSource
jof.resourceRef = true

realm = org.apache.shiro.realm.jdbc.JdbcRealm
realm.permissionsLookupEnabled = true
realm.credentialsMatcher = $pm
; Note factories are automatically invoked via getInstance(),
;   see org.apache.shiro.authc.config.ReflectionBuilder::resolveReference
realm.dataSource = $jof

securityManager.realms = $realm

[urls]
/rest/** = authcBasic
/prot/** = authcBasic

以下在我的数据库中:

mysql> select * from users;
+----------+------------------+----------+----------------------------------------------+--------------------------+
| username | email            | verified | password                                     | password_salt            |
+----------+------------------+----------+----------------------------------------------+--------------------------+
| admin    | a.muys@********* |        1 | ojSiTecNwRF0MunGRvz3DRSgP7sMF9EAR77Ol/2IAY8= | eHp9XedrIUa5sECfOb+KOA== |
+----------+------------------+----------+----------------------------------------------+--------------------------+
1 row in set (0.00 sec)

如果我用的话 SimpleCredentialsManager 它根据users表中的明文密码进行身份验证。试着用 PasswordMatcher 一直非常令人沮丧。

密码和password_salt是通过shiro-tools获得的 Hasher 效用。

当我尝试对基本身份进行身份验证时 HelloWorld 我用于测试的servlet(path = rest / hello,context = / ws),我在日志中得到以下内容:

15:35:38.667 [http-8080-2] TRACE org.apache.shiro.util.ClassUtils - Unable to load clazz named [ojSiTecNwRF0MunGRvz3DRSgP7sMF9EAR77Ol/2IAY8=] from class loader [WebappClassLoader
  context: /ws
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@79ddd026
]

(完整登录 https://gist.github.com/recurse/5915693 )

它似乎试图加载我的哈希密码作为类名。这是一个错误,还是我的配置错误?如果它是一个错误,我该如何解决它?如果是配置错误,我缺少什么?


4274
2017-07-03 05:43


起源

正是我在寻找的东西,谢谢你,顺便说一句,你是否遵循了这种设置的任何教程?我试图将我的jdbc领域与sha哈希集成,并且无法找到任何相关的教程。 - abdu
不。我阅读了Shiro网站上的文档,了解API的基本结构;然后,我检查了代码并反向设计了JDBC配置。 - Recurse


答案:


首先,感谢您为此问题提供了大量信息 - 这使得提供答案变得更加容易。

通过查看示例数据库行列表,您似乎不会存储PasswordService在执行散列密码比较时所期望的输出。例如:

$ java -jar ~/.m2/repository/org/apache/shiro/tools/shiro-tools-hasher/1.2.2/shiro-tools-hasher-1.2.2-cli.jar -p
Password to hash:
Password to hash (confirm):
$shiro1$SHA-256$500000$uxaA2ngfdxdXpvSWzpuFdg==$hOJZc+3+bFYYRgVn5wkbQL+m/FseeqDtoM5mOiwAR3E=

以...开头的字符串 $shiro1$ 是你将节省的 password 数据库中的列。没有必要单独的盐柱,因为Shiro需要的所有信息都在 $shiro1$... 串。

DefaultPasswordService 使用相同的默认配置参数(SHA-256,500,000次迭代等),因此如果您使用上面显示的Hasher CLI工具(没有额外的哈希算法配置),则无需自定义 DefaultPasswordService POJO任何进一步的。但是,如果在CLI上更改散列参数,则需要确保在其上配置相同的参数 DefaultPasswordService bean(和/或其内部HashingService)。

如果您仍在测试并且可以更改您的数据库架构,我建议现在这样做,以便有一个存储该数据的密码字段 $shiro1$... 串。然后使用PasswordService,如下所示 用法

http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/PasswordService.html


9
2017-07-03 16:08



在此配置 shiro.ini 在...上描述 用法 页面由@LesHazlewood链接。有关在Java中完成的配置,请参见此处 stackoverflow.com/a/45225711/2969332 - Robert Mikes