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
/を返すかはよくわかりません。インターセプターのコード スニペットは次のとおりです。 false
preHandle()
@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;
}
.
これは有効なアプローチですか?代替案はありますか?