Широ с 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 3

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 используется в коде приложения.