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
}
}
何か案は?