Использование PasswordMatcher Широ с пользовательским царством

Я использую Apache Shiro с пользовательской областью JDBC для извлечения соли пользователя, пароля, имени алгоритма хеширования и количества итераций хеша из базы данных, которые все хранятся в виде отдельных столбцов.

Проблема заключается в том, что я не уверен, как мне следует обращаться с солью, которая была извлечена из базы данных, при использовании PasswordMatcher для проверки совпадений пароля пользователя, хранящегося в базе данных.

При использовании HashedCredentialsMatcher соль устанавливается с помощьюsetCredentialsSalt метод, однако, кажется, что это не тот случай, когда используется PasswordMatcher вместо HashedCredentialsMatcher.

Код, который я использую в пользовательской области JDBC, выглядит следующим образом

@Override 
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 

        //code to retrieve user details from database removed for brevity 

        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, passwdSalt.password, getName()); 
        info.setCredentialsSalt(new SimpleByteSource(passwdSalt.salt)); 

        DefaultPasswordService passwordService = new DefaultPasswordService(); 
        DefaultHashService hashService = new DefaultHashService(); 
        PasswordMatcher passwordMatcher = new PasswordMatcher(); 

        hashService.setHashAlgorithmName(passwdSalt.hashAlgorithmName); 
        hashService.setHashIterations(passwdSalt.hashIterations); 
        passwordService.setHashService(hashService); 
        passwordMatcher.setPasswordService(passwordService); 
        setCredentialsMatcher(passwordMatcher); 

        return info; 
} 

Пройдя по коду, я подтвердил, что проблема определенно связана с тем, что соль не используется при хешировании пароля, введенного пользователем, чтобы сопоставить его с хешированным паролем в базе данных. В DefaultPasswordService.java при вызове метода passwordsMatch (Object submitPlaintext, String сохранено) в строке 160 объект с именемrequest содержит следующее

algorithmName=null 
iterations=0 
salt=null 
source=cGFzc3dvcmQ= 

Следующая строка кода на строке 161 вызываетcomputeHash(request)

В DefaultHashService.java, когда методcomputeHash(HashRequest request) в строках 155 и 157 переменные имя_граммы и итерации правильно установленыSHA-256 а также1 соответственно. По строке 159 методgetPublicSalt(request) называется однако, он возвращает нуль.

Кто-нибудь еще использовал PasswordMatcher Shiro с пользовательской областью, и если вы скажете Shiro использовать соль?

Ответы на вопрос(3)

Ваш ответ на вопрос