2

私は 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;
        }
    }

しかし、新しく生成されたアカウントを使用してログインすると、成功しません。デバッグ結果は、ユーザーオブジェクトを正しく取得しました。何か案が?

どうもありがとう。

4

2 に答える 2

2

HashedCredentialsMatcher古い Shiro のコンセプトです。代わりに、を使用することを強くお勧めします。これは、ここに記載されてPasswordServiceいるように対応PasswordMatcherしています。

https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/authc/credential/PasswordService.html

于 2013-06-13T20:31:36.767 に答える
0

問題は解決しました。カスタム 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);
于 2013-06-12T03:31:17.087 に答える