apache shiro с помощью хэширования учетных данных не может сделать вход успешно
Я использую shiro, и я использую учетные данные хэширования в качестве своих учетных данных.
Вот мой Широ.конфигурация ini:
credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = false
credentialsMatcher.hashIterations = 1024
realmA.credentialsMatcher = $credentialsMatcher
securityManager.realms = $realmA
Ниже показано, как я генерирую соль и хэшированный пароль:
RandomNumberGenerator rng = new SecureRandomNumberGenerator();
ByteSource salt = rng.nextBytes();
String passwordsalt=salt.toBase64();
String hashedPasswordBase64 = new Sha256Hash(user.getPassword(),
salt, 1024).toBase64();
user.setPassword(hashedPasswordBase64);
user.setByteTabSalt(passwordsalt);
dao.createUser(user);
Это область, которую я расширил:
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authToken;
User user = dao.getForUsername(token.getUsername());
if (user != null) {
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
user.getEmail_account(), user.getPassword(), getName());
ByteSource salt = new SimpleByteSource(Base64.decode(user
.getByteTabSalt()));
info.setCredentialsSalt(salt);
return info;
} else {
return null;
}
}
Но когда я использую свою новую сгенерированную учетную запись для входа в систему, я никогда не добиваюсь успеха.
результат отладки - я получил объект пользователя правильно. есть идеи?
Большое вам спасибо.
2 ответа:
HashedCredentialsMatcher
- это более древняя концепция Широ. Вместо этого я настоятельно рекомендую использоватьPasswordService
, и это соответствуетPasswordMatcher
, как описано здесь:Https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/authc/credential/PasswordService.html
Проблема решена, мне нужно установить сопоставитель учетных данных в моем пользовательском EnvironmentLoaderListener:
WebEnvironment environment = super.createEnvironment(pServletContext); RealmSecurityManager rsm = (RealmSecurityManager) environment .getSecurityManager(); HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(); matcher.setHashAlgorithmName(Sha256Hash.ALGORITHM_NAME); matcher.setHashIterations(1024); matcher.setStoredCredentialsHexEncoded(false);