2013-07-03 2 views
11

Я пытаюсь выполнить аутентификацию сервлета, работающего в Tomcat 6, используя Shiro.Использование JDBCRealm для аутентификации пользователя с помощью Shiro

У меня есть следующий 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 | [email protected]********* |  1 | ojSiTecNwRF0MunGRvz3DRSgP7sMF9EAR77Ol/2IAY8= | eHp9XedrIUa5sECfOb+KOA== | 
+----------+------------------+----------+----------------------------------------------+--------------------------+ 
1 row in set (0.00 sec) 

Если я использую SimpleCredentialsManager он проверяет подлинность штрафа в отношении открытого текста пароля в таблице пользователей , Попытка использовать PasswordMatcher была крайне расстраивающей.

Пароль и пароль_salt были получены с помощью утилиты shiro-tools Hasher.

При попытке аутентификации на базовом HelloWorld сервлета я использую для тестирования (путь = отдых/привет, контекст =/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: 
[email protected] 
] 

(Полный журнал в https://gist.github.com/recurse/5915693)

Похоже, что пытается загрузить мой хешированный пароль в качестве имени класса. Является ли это ошибкой или ошибкой конфигурации с моей стороны? Если это ошибка, как я могу ее обойти? Если это ошибка конфигурации, что мне не хватает?

+0

только то, что я искал, спасибо, кстати вы следовать любому учебнику для такого рода настройки? Я пытался интегрировать область jdbc с sha-хэшами и не мог найти подходящих учебников. – abdu

+0

Нет. Я прочитал документацию на сайте Shiro, чтобы понять основную структуру API; затем я проверил код и обратный дизайн JDBC. – Recurse

ответ

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 столбца в базе данных. Нет необходимости в отдельном столбце соли, поскольку вся информация, которую требуется Сиро, находится в строке $shiro1$....

DefaultPasswordService использует те же параметры конфигурации по умолчанию (SHA-256, 500 000 итераций и т. Д.), Поэтому, если вы используете инструмент Хашера CLI, как я показал выше (нет дополнительной конфигурации хеш-алгоритма), вам не нужно настройте DefaultPasswordService POJO дальше. Однако, если вы измените параметры хэширования в CLI, вам необходимо убедиться, что одни и те же параметры настроены на bean-компоненте DefaultPasswordService (и/или его внутреннем HashingService).

Если вы все еще тестируете и можете изменить свою схему БД, я бы рекомендовал сделать это сейчас, чтобы иметь одно поле пароля, в котором хранится строка $shiro1$.... Затем вы используете PasswordService как описано здесь под Использованием:

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

+0

Конфигурирование этого в 'siro.ini' описано на странице ** Использование **, связанной с @LesHazlewood. Для конфигурации, выполненной в Java, см. Здесь: https://stackoverflow.com/a/45225711/2969332 –

Смежные вопросы