我正在尝试使用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
,它会对用户表中的明文密码进行身份验证。尝试使用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)
它似乎试图将我的哈希密码加载为类名。这是一个错误,还是我的配置错误?如果它是一个bug,我该如何解决它?如果是配置错误,我缺少什么?
答案 0 :(得分:9)
首先,感谢您为此问题提供了大量信息 - 这使得提供答案变得更加容易。
通过查看示例数据库行列表,您似乎不会存储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$...
字符串。然后使用密码服务,如用法: