Spring MVC - 会话验证的正确方法

时间:2017-01-17 15:33:09

标签: java spring-mvc spring-boot spring-security

目前在我的大多数控制器类中,我都会检查每个映射是否存在会话。

例如:

@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)){
...
}
}

有没有办法在调用AdminController后检查会话,而不是检查每个映射的会话?

2 个答案:

答案 0 :(得分:3)

如果您不想涉及Spring Security,可以添加拦截所有请求的拦截器。

public class SessionCheck extends HandlerInterceptorAdapter {
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      return exists(request.getSession());
   }
}

答案 1 :(得分:2)

首先,如果可以,请切换到Spring Boot。配置会更容易。

是的,在您可以指定的WebSecurityConfigurerAdapterImpl中,用户必须具有某个角色才能访问某些区域。在你的情况下,它将是

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

您还可以使用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){

    }

}

您必须启用此注释。它在Documentation.

中有所描述

总结一下,您需要Spring Security,然后在WebSecurityConfigurerAdapter中配置访问权限或启用基于注释的访问控制,然后指定@PreAuthorize

修改
好的,因为OP要求澄清,我决定添加一些关于使用Spring Security的更一般的信息。

Spring Security中,我们基于UserDetailsUserDetailsService,在登录时返回UserDetails。虽然,我建议您重构代码,但只有一个UserCollection authorities的{​​{1}},您可以执行以下操作。

创建将UserDetailsImpl实施UserDetails的新类。还可以创建一些自定义角色,例如ROLE_USERROLE_ADMIN。它们应该是一个枚举。然后在您的UserDetailsImpl中有会话期间重要的字段 - 记录用户UUID,姓名,电子邮件以及界面所需的某些内容 - isAccountLockedisPasswordExpired等,您还需要您将通过某种方法返回的权限集合。

然后,您就可以在代码中使用hasRole。什么是酷的,您还可以从上下文中获取应用程序中记录的用户详细信息。