MVC intercepteur vs Printemps filtre de sécurité vs autre chose...?

Je suis en utilisant Spring-MVC, Spring Security pour mon application web. Il comprend l'inscription de l'utilisateur pages et privé panneau de l'utilisateur. Je l'ai mis en place actuellement avec l'URL suivant les modèles:

  • whatever/myapp/login utilisateur d'ouvrir une session dans
  • whatever/myapp/register?step=1 démarrer l'enregistrement
  • whatever/myapp/account/** domaine privé de vues (pages)
  • whatever/myapp/pending vue affiché pendant le post-processus d'inscription complet
  • whatever/myapp/blocked compte bloqué vue
  • whatever/myapp/register/retry si l'enregistrement a échoué, permettent de réessayer

Essentiellement, ces Url ci-dessous devrait exiger l'authentification de l'utilisateur, c'est à dire besoin de connexion:

  • whatever/myapp/account/** (domaine privé de pages)
  • whatever/myapp/pending (cette page dispose d'une minuterie à rediriger vers /compte/foyer)
  • whatever/myapp/register/retry

C'est assez simple à réaliser à l'aide de Spring security. Cependant, indépendamment de l'authentification de l'utilisateur par le biais de Printemps de la sécurité, domaine privé de la page doit être accessible ou non, en fonction de l'utilisateur du compte courant de l'état (stocké dans ma DB).

Plus précisément: si un utilisateur tente d'accéder à quoi que ce soit dans le secteur privé (/account/**), il doit être démontré la vue appropriée (redirigé à la page appropriée), selon le statut. J'ai ces statuts définis:

  • suspended - est lié à l'attente de vue
  • enabled - autoriser l'accès complet
  • disabled - ne sont pas pertinentes ici
  • retry_allowed- se rapporte à réessayer de vue
  • blocked - se rapporte à un compte bloqué vue

Actuellement, j'ai un MVC intercepteur de l'installation de /account/**, qui vérifie l'état de l'utilisateur, et redirige vers les pages appropriées, mais de toute façon j'ai l'impression que ce n'est pas vraiment l'idéal ou une solution appropriée ici, depuis que je suis face à un comportement étrange, comme plusieurs de contrôleur de l'invocation... et aussi je ne suis pas tout à fait certain que le retour true /false dans preHandle() méthode. Voici l'extrait de code de l'intercepteur:

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

.

Est-ce une approche valable ? Toutes les autres suggestions ?

OriginalL'auteur Less | 2013-10-10