Actuellement, dans la plupart de mes classes de contrôleur, je vérifie si la session existe pour chaque mappage.

Par exemple:

@Controller
@RequestMapping("/admin")
public class AdminController{

@GetMapping
public ModelAndView admin(HttpSession session){
if(exists(session)){
...
}
}

@GetMapping("/addUser")
public ModelAndView user(HttpSession session){
if(exists(session)){
...
}
}

@GetMapping("/addBook")
public ModelAndView book(HttpSession session){
if(exists(session)){
...
}
}

Existe-t-il un moyen de vérifier la session une fois que l'AdminController est appelé, au lieu de vérifier la session pour chaque mappage?

1
Shashank Raghunath 17 janv. 2017 à 18:33

2 réponses

Meilleure réponse

Tout d'abord, au cas où vous le pouvez, passez à Spring Boot. La configuration sera alors plus facile.

Oui, dans votre WebSecurityConfigurerAdapterImpl, vous pouvez spécifier que l'utilisateur doit avoir un certain rôle pour accéder à certaines zones. Dans votre cas, ce serait

http
    .antMatches("/admin/**").hasRole(<UserRole.Admin>);

Vous pouvez également utiliser PreAuthorize:

@Controller
@RequestMapping("/admin")
public class AdminController{
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping
    public ModelAndView admin(HttpSession session){

    }
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/addUser")
    public ModelAndView user(HttpSession session){

    }
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/addBook")
    public ModelAndView book(HttpSession session){

    }

}

Vous devez activer l'utilisation de cette annotation. Il est décrit dans la Documentation.

Pour résumer, vous avez besoin de Spring Security, puis soit configurer l'accès dans WebSecurityConfigurerAdapter, soit activer le contrôle d'accès basé sur les annotations, puis spécifier le @PreAuthorize.

Modifier:
OK, comme l'OP a demandé des éclaircissements, j'ai décidé d'ajouter des informations plus générales sur l'utilisation de Spring Security.

Dans Spring Security, nous nous basons sur UserDetails et UserDetailsService qui renvoie UserDetails lors de la connexion. Bien que je vous recommande de refactoriser votre code et de n'avoir qu'une seule classe User qui a un Collection de authorities, vous pouvez faire ce qui suit.

Créez une nouvelle classe qui serait UserDetailsImpl qui implémenterait UserDetails. Créez également des rôles personnalisés tels que ROLE_USER, ROLE_ADMIN. Ils devraient être une énumération. Ensuite, dans votre UserDetailsImpl, ayez des champs qui sont importants pendant la session - UUID de l'utilisateur connecté, nom, e-mail et d'une manière ou d'une autre requis par l'interface - isAccountLocked, isPasswordExpired etc., vous aurez également besoin une collection d'autorités que vous retournerez par une certaine méthode.

Vous pourrez alors utiliser hasRole dans votre code. Ce qui est cool, vous pourrez également obtenir les détails de l'utilisateur enregistré dans votre application à partir du contexte.

2
xenteros 17 janv. 2017 à 15:58

Si vous ne souhaitez pas impliquer Spring Security, vous pouvez ajouter un intercepteur qui interceptera toutes les demandes.

public class SessionCheck extends HandlerInterceptorAdapter {
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      return exists(request.getSession());
   }
}
3
lane.maxwell 17 janv. 2017 à 16:10