1

Spring のセキュリティ 3.1.x を使用して、ヘルプまたは指示が必要です。

暗号化されたパスワードを MySql データベースに保存しています。varchar(60) 列として定義されているパスワード。

初めて Web アプリを実行したときに、次のコード スニペットを使用してパスワードを生成しました。

String p = "12345";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(p);

次に、String encodedPassword を取得し、データベースの列に貼り付けました。コードを authentication-manager に保持し (スニペットが続きます)、encodedPassword をサーバー ログに記録しました。

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider user-service-ref="usersDAO"> 
        <security:password-encoder ref="encoder" />
    </security:authentication-provider>
</security:authentication-manager>

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

私の問題は、認証が例外で失敗することです: BCryptPasswordEncoder.matches() 実行時の認証情報が正しくありません。保存されたパスワードは、フォーム入力から生成されたハッシュと一致しません。最初のハッシュ生成で使用されたものと同じテキスト パスワードが使用されました。

同じテキストを入力してログインを再実行するたびに、ログに記録されたencodedPasswordが異なります。デバッグ エンティティがデータベースから正しく返されている場所を確認できるので、それは問題ではないと思います。この問題は、テキストパスワードが入力されるたびに同じハッシュを生成するために、何かを正しく実行/設定していないように思えます。

編集: usersDAO を追加します。

import org.springframework.security.core.userdetails.UserDetailsService;

public interface UsersDAO extends Dao<Users>, UserDetailsService 
{
    Users getByUsername(String username);   
}

編集:実装を追加します。

import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Repository("usersDAO")
public class UsersDAO_DB extends AbstractHibernateDao<Users> implements UsersDAO
{
final Logger log = LoggerFactory.getLogger(this.getClass());

@Override
public Users getByUsername(String username) 
{
    String p = "12345";
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String encodedPassword = passwordEncoder.encode(p);
    log.debug("HELLOZ  ---->  " + encodedPassword);

    notNull(username, "username can't be null");
    return (Users) getSession()
        .getNamedQuery("users.byUsername")
        .setParameter("username", username)
        .uniqueResult();
}

@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws     UsernameNotFoundException, DataAccessException {
    notNull(username, "username can't be null");
    Users users = getByUsername(username);
    if (users == null) {
        throw new UsernameNotFoundException("No user with username " +  username);
    }
    return users;
}


@Override
public void create(Users t)
{
    // TODO Auto-generated method stub
}

@Override
public void update(Users t)
{
    // TODO Auto-generated method stub

}

@Override
public void delete(Users t)
{
    // TODO Auto-generated method stub

}

}

何か案は?

4

2 に答える 2

2

これは、いくつかの異なるチュートリアルに従った初心者のエラーです。

Bean で、セキュリティエンコーダーを org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder として定義しました。

テスト用の暗号パスワードを生成するために、次のコードを使用しました。

String p = "12345";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(p);
log.debug("HELLOZ  ---->  " + encodedPassword);

これは、org.springframework.security.crypto.password.PasswordEncoder と org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder を混合していました。上記の passwordEncoder を定義するコードを参照してください。

それを次のように変更したら:

String p = "12345";
BCryptPasswordEncoder pe= new BCryptPasswordEncoder();
String encPassword =pe.encode(p);
log.debug("HELLB  ---->  " + encPassword);

出力をデータベースにコピーし、すべてが正常に機能することを再テストしました。

于 2013-10-29T14:28:49.383 に答える
1

同じテキストを入力してログインを再実行するたびに、ログに記録されたencodedPasswordが異なります。」

そのロギングはどこから来ていますか?Spring Security は着信パスワードをログに記録しません。また、BCrypt を使用している場合は、パスワードを最初から再エンコードするべきではありません。

提出されたパスワードを自分で再エンコードしているように思えますが、表示されてusersDAOいない可能性があります。

そうでない場合は、完全な構成と、話しているログ出力を投稿してください。

于 2013-10-24T17:08:05.630 に答える