Usando o PasswordMatcher de Shiro com um reino personalizado

Estou usando o Apache Shiro com um território JDBC personalizado para recuperar o status de sal, senha, hash do algoritmo de hash do usuário e o número de iterações de hash do banco de dados, todas armazenadas como colunas separadas.

O problema é que não tenho certeza de como lidar com o salt recuperado do banco de dados ao usar o PasswordMatcher para verificar se a senha do usuário corresponde àquela armazenada no banco de dados.

Ao usar o HashedCredentialsMatcher, o sal é definido usando osetCredentialsSalt método, no entanto, parece que este não é o caso quando se utiliza o PasswordMatcher em vez do HashedCredentialsMatcher.

O código que estou usando no domínio JDBC personalizado é o seguinte

@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; 
} 

Depois de passar pelo código, confirmei que o problema é definitivamente devido ao fato de o salt não estar sendo usado ao codificar a senha inserida pelo usuário, a fim de associá-la à senha com hash do banco de dados. Em DefaultPasswordService.java quando o método passwordsMatch (Object submittedPlaintext, String salvo) é chamado na linha 160 do objeto nomeadorequest contém o seguinte

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

A próxima linha de código na linha 161 chamadascomputeHash(request)

Em DefaultHashService.java quando o métodocomputeHash(HashRequest request) é chamado, nas linhas 155 e 157, as variáveis ​​algorithmName e iterações estão corretamente definidas comoSHA-256 e1 respectivamente. Na linha 159 o métodogetPublicSalt(request) é chamado no entanto, ele retira null.

Alguém mais usou o PasswordMatcher de Shiro com um reino personalizado e como você diz ao Shiro para usar o sal?

questionAnswers(3)

yourAnswerToTheQuestion