私は春のセキュリティを使用してパスワード変更機能を実装しましたが、((UserDetails)プリンシパル).getPassword())はログインしているユーザーに対してnullを返しています。UserDetails getPasswordは、春のセキュリティ3.1ではnullを返します。現在ログインしているユーザーのパスワードを取得する方法は?
私が正しく覚えていれば、以前は3.0で動作していました。 3.1で変更されたため、ログインしているユーザーの現在のパスワードを取得できませんでしたか?
以下のコードでは、Webページからユーザーパスワードで入力された現在のパスワードを確認しています。次に、ログインしたユーザーのパスワードが入力されたパスワードと一致するかどうかを確認します。そうであれば、oldPasswordMatchNewPassword = trueを設定します。
この機能を実装するにはどうすればよいですか?
@RequestMapping(value = "/account/changePassword.do", method = RequestMethod.POST)
public String submitChangePasswordPage(
@RequestParam("oldpassword") String oldPassword,
@RequestParam("password") String newPassword) {
Object principal = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
String username = principal.toString();
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
System.out.println("username: " + username);
System.out.println("password: "
+ ((UserDetails) principal).getPassword());
if (((UserDetails) principal).getPassword() != null) {
if (((UserDetails) principal).getPassword().equals(oldPassword)) {
oldPasswordMatchNewPassword = true;
}
}
}
if (oldPasswordMatchNewPassword == true) {
logger.info("Old password matches new password. Password will be updated.");
changePasswordDao.changePassword(username, newPassword);
SecurityContextHolder.clearContext();
return "redirect:home.do";
} else {
logger.info("Old password did not match new password. Password will be not be updated.");
return null;
}
}
返される値がわかるように、いくつかのsysout()を追加しました。 ((UserDetails)プリンシパル).getUsername()正しいログインユーザーを確認できます。 ((UserDetails)プリンシパル).getPassword()nullを返します。
どのようにして((UserDetails)プリンシパル).getPassword()この値を取得しますか?
ありがとうございます!
これは意味があります。では、これを実行するベストプラクティスは何ですか?私はeraseCredentialsAfterAuthenticationをセキュリティ上のリスクを引き起こす可能性があるため、オフにしたくありません。これを理解するのを助けてくれますか? – texasdude11