AuthenticationProvider
カスタム セキュリティ チェックを実行するためのカスタムを作成しました。AccountStatusException
また、ユーザーが特定の期間自分のアカウントを確認していない場合など、ユーザー ステータスの問題を通知するために継承するカスタム例外も作成しました。MyUserDetails
もカスタム実装です。
これは、私が実行するセキュリティ チェックのコードです。ケースに関係のないコードは省略されています。
public class SsoAuthenticationProvider implements AuthenticationProvider {
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = (String) authentication.getPrincipal();
User user = null;
if (username != null) {
user = getUserRepository().findByUserName(username);
if (user != null) {
if (user.getEnabled() != 0) {
if ((user.getUserDetail().getConfirmed() != 0)
|| ((new Date().getTime() - user.getUserDetail().getRequestDate().getTime()) / (1000 * 60 * 60 * 24)) <= getUnconfirmedDays()) {
if (getPasswordEncoder().isPasswordValid(user.getPassword(),
(String) authentication.getCredentials(), user)) {
user.authenticated = true;
user.getAuthorities();
}
} else {
throw new UserNotConfirmedAndTimeExceeded(
"User has not been cofirmed in the established time period");
}
} else {
throw new DisabledException("User is disabled");
}
} else {
throw new BadCredentialsException("User or password incorrect");
}
} else {
throw new AuthenticationCredentialsNotFoundException("No credentials found in context");
}
return user;
}
}
SsoAuthenticationProvider
チェック:
- ユーザー名が登録されている(データベースに存在する)こと
- ユーザーがメールを確認したこと
- ユーザーが電子メールを確認していない場合は、まだ猶予期間内であることを確認してください (これは、サイトへのアクセスを許可しながら電子メールを確認するためにユーザーに与える数日間です)
- ユーザーがメールを確認しておらず、猶予期間中ではない場合、セキュリティ例外をスローしてこれらのステータスを通知し、認証を拒否します
問題は、これらの例外のすべてがコントローラーまでスタックにスローされるわけではないため、ログインの問題についてユーザーに通知することが不可能に見えることです。
UserDetails
などの (および類似の) メソッドを使用するisEnabled()
ことはできません。さまざまなユーザー アカウント ステータスのセマンティクスが完全に異なるためです。
これは、カスタム例外を使用してカスタム セキュリティを構築するための正しいアプローチですか? これを機能させるには sth else を実装する必要がありますか?