目前在我的大多数控制器类中,我都会检查每个映射是否存在会话。
例如:
@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后检查会话,而不是检查每个映射的会话?
答案 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
中,我们基于UserDetails
和UserDetailsService
,在登录时返回UserDetails
。虽然,我建议您重构代码,但只有一个User
个Collection
authorities
的{{1}},您可以执行以下操作。
创建将UserDetailsImpl
实施UserDetails
的新类。还可以创建一些自定义角色,例如ROLE_USER
,ROLE_ADMIN
。它们应该是一个枚举。然后在您的UserDetailsImpl
中有会话期间重要的字段 - 记录用户UUID,姓名,电子邮件以及界面所需的某些内容 - isAccountLocked
,isPasswordExpired
等,您还需要您将通过某种方法返回的权限集合。
然后,您就可以在代码中使用hasRole
。什么是酷的,您还可以从上下文中获取应用程序中记录的用户详细信息。