14

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;
}

.

これは有効なアプローチですか?代替案はありますか?

4

1 に答える 1