Широ с jdbc и хэшированными паролями
Вот мой Широ конфиг
[main]
authc.loginUrl = /site/index.jsp
authc.usernameParam = user
authc.passwordParam = pass
authc.rememberMeParam = remember
authc.successUrl = /site/home.jsp
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled=true
jdbcRealm.authenticationQuery = select password from users where username = ?
jdbcRealm.userRolesQuery = select role from users where username = ?
credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName = SHA-256
credentialsMatcher.storedCredentialsHexEncoded = true
credentialsMatcher.hashIterations = 5000
jdbcRealm.credentialsMatcher = $credentialsMatcher
jof = org.apache.shiro.jndi.JndiObjectFactory
jof.resourceName = jdbc/postgres
jof.requiredType = javax.sql.DataSource
jof.resourceRef = true
jdbcRealm.dataSource = $jof
securityManager.realms = jdbcRealm
[urls]
/theme/** = anon
/site/** = authc
/site/cards.jsp = roles[smoto,admin]
/site/jobs.jsp = roles[admin]
Я создал хэш вот так для admin password admin
String hashedPassword = new Sha256Hash("admin", "",5000).toHex();
Я вставил хэш в БД, но моя аутентификация каждый раз терпит неудачу, у кого-нибудь есть опыт работы с такого рода настройками с Широ? Кроме того, как бы я включил отладку или ведение журнала для shiro?
Править: вот правильная настройка для этого вида аутентификации, найденная в другом сообщении stackoverflow
[main]
authc.loginUrl = /site/index.jsp
authc.usernameParam = user
authc.passwordParam = pass
authc.rememberMeParam = remember
authc.successUrl = /site/home.jsp
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled=false
jdbcRealm.authenticationQuery = select password from users where username = ?
jdbcRealm.userRolesQuery = select role from users where username = ?
ps = org.apache.shiro.authc.credential.DefaultPasswordService
pm = org.apache.shiro.authc.credential.PasswordMatcher
pm.passwordService = $ps
jof = org.apache.shiro.jndi.JndiObjectFactory
jof.resourceName = jdbc/postgres
jof.requiredType = javax.sql.DataSource
jof.resourceRef = true
jdbcRealm.dataSource = $jof
jdbcRealm.credentialsMatcher = $pm
#securityManager.realms = jdbcRealm
[urls]
/theme/** = anon
/site/** = authc
/site/cards.jsp = roles[smoto,admin]
/site/jobs.jsp = roles[admin]
Фокус в том, чтобы использовать инструмент хеширования, который shiro предоставляет и копирует точный вывод в поле базы данных "пароль", вся строка будет содержать информацию о том, какой алгоритм используется, сколько итераций и т. д., Пример:
$shiro1$SHA-256$500000$salthere$hashhere
1 ответ:
Да, HashedCredentialsMatcher, хотя и достаточно, немного старше. Возможно, вы найдете более новый PasswordMatcher Широ более простым в использовании. Вы можете настроить его внутренний PasswordService довольно легко:
[main] passwordService = org.apache.shiro.authc.credential.DefaultPasswordService #configure the passwordService to use the settings you desire #... passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher passwordMatcher.passwordService = $passwordService #... # Finally, set the matcher on a realm that requires password matching for account authentication: myRealm = ... myRealm.credentialsMatcher = $passwordMatcher
Вы можете использовать экземпляр
PasswordService
в вашем приложении для создания хэша пароля при создании учетной записи или обновлении пароля учетной записи:String submittedPlaintextPassword = ... String encryptedValue = passwordService.encryptPassword(submittedPlaintextPassword); ... userAccount.setPassword(encryptedValue); userAccount.save(); //create or update to your data store
Просто убедитесь, что служба паролей, настроенная в
shiro.ini
, имеет ту же конфигурацию, что иpasswordService
используется в коде приложения.