Web アプリケーションに Spring Security で Spring-MVC を使用しています。これには、ユーザー登録ページとプライベート ユーザー パネルが含まれます。現在、次の URL パターンを使用してセットアップしています。
whatever/myapp/loginユーザーログインwhatever/myapp/register?step=1登録を開始whatever/myapp/account/**プライベート エリア ビュー (ページ)whatever/myapp/pending登録後のプロセスが完了するまでに表示されるビューwhatever/myapp/blockedアカウントがブロックされたビューwhatever/myapp/register/retry登録に失敗した場合、再試行を許可する
基本的に、以下の URL ではユーザー認証が必要です。つまり、ログインが必要です。
whatever/myapp/account/**(プライベートエリアページ)whatever/myapp/pending(このページにはタイマーが設定されており、/account/home にリダイレクトされます)whatever/myapp/register/retry
これは、Spring セキュリティを使用して達成するのは非常に簡単です。ただし、Spring セキュリティによるユーザー認証に関係なく、ユーザーの現在のアカウント ステータス (私の DB に格納されている) に応じて、プライベート エリア ページにアクセスできるかどうかが決まります。
具体的には、ユーザーがプライベート エリア ( /account/**) 内の何かにアクセスしようとすると、ステータスに応じて適切なビューが表示される (適切なページにリダイレクトされる) 必要があります。これらのステータスが定義されています。
suspended- 保留中のビューに関連するenabled- フルアクセスを許可disabled- ここでは関係ありませんretry_allowed- 再試行ビューに関連blocked- アカウントがブロックされたビューに関連する
/account/**現在、ユーザーステータスをチェックし、適切なページにリダイレクトするMVCインターセプターをセットアップしていますが、複数のコントローラーなどの奇妙な動作に直面しているため、これは実際には理想的または適切なソリューションではないと感じています呼び出し...また、メソッド内でいつtrue/を返すかはよくわかりません。インターセプターのコード スニペットは次のとおりです。 falsepreHandle()
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object arg2)
throws Exception {
IPanelUser pUser = (IPanelUser) SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
// check principal first and then load from DB
// "suspended" is initial status upon registration
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
// if suspended, load from DB and update status
Customer customer = this.customerService.getUserByUsername(pUser.getUsername());
if(customer != null)
pUser.getCustomer().setStatus(customer.getStatus());
// still suspended? redirect to pending
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
response.sendRedirect("../pending");
return false;
}
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Blocked.getCode()) {
// redirect to blocked page
response.sendRedirect("../blocked");
SecurityContextHolder.clearContext();
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.AllowRetry.getCode()) {
// redirect to CC submission page
response.sendRedirect("../register/retry");
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Enabled.getCode() ||
pUser.getCustomer().getStatus() == CustomerStatus.Disabled.getCode()) {
// do nothing
}
return true;
}
.
これは有効なアプローチですか?代替案はありますか?