Java Spring MVC-会话验证的正确方法
目前,在我的大多数控制器类中,我检查每个映射是否存在会话 例如:Java Spring MVC-会话验证的正确方法,java,spring-mvc,spring-boot,spring-security,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(HttpSessi
@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后检查会话,而不是检查每个映射的会话?首先,如果可以,请切换到Spring Boot
。配置将更容易
是的,在websecurityConfigureAdapterImpl
中,您可以指定用户必须具有特定角色才能访问特定区域。在你的情况下是这样的
http
.antMatches("/admin/**").hasRole(<UserRole.Admin>);
您必须启用使用此批注。这在
总之,您需要Spring-Security
,然后在WebSecurityConfigurerAdapter
中配置访问,或者启用基于注释的访问控制,然后指定@PreAuthorize
编辑:好的,由于OP要求澄清,我决定添加一些关于使用
Spring安全性的一般信息
在Spring-Security
中,我们基于UserDetails
和UserDetails-service
登录时返回UserDetails
。尽管如此,我还是建议您重构代码,只需要一个类User
,它拥有权限的集合
,您可以执行以下操作
创建新类,该类将是userdetailsimple
,它将实现UserDetails
。还可以创建一些自定义角色,如ROLE\u USER
,ROLE\u ADMIN
。它们应该是枚举。然后,在您的userdetailsiml
中有一些在会话期间很重要的字段-记录的用户UUID、姓名、电子邮件和一些界面所需的字段-是AccountLocked
、isPasswordExpired
等,您还需要一个权限集合,您将通过某种方法返回这些权限
您将能够在代码中使用hasprole
。最酷的是,您还可以从上下文中获取应用程序中记录的用户详细信息。首先,如果可以,请切换到Spring Boot
。配置将更容易
是的,在websecurityConfigureAdapterImpl
中,您可以指定用户必须具有特定角色才能访问特定区域。在你的情况下是这样的
http
.antMatches("/admin/**").hasRole(<UserRole.Admin>);
您必须启用使用此批注。这在
总之,您需要Spring-Security
,然后在WebSecurityConfigurerAdapter
中配置访问,或者启用基于注释的访问控制,然后指定@PreAuthorize
编辑:
好的,由于OP要求澄清,我决定添加一些关于使用Spring安全性的一般信息
在Spring-Security
中,我们基于UserDetails
和UserDetails-service
登录时返回UserDetails
。尽管如此,我还是建议您重构代码,只需要一个类User
,它拥有权限的集合
,您可以执行以下操作
创建新类,该类将是userdetailsimple
,它将实现UserDetails
。还可以创建一些自定义角色,如ROLE\u USER
,ROLE\u ADMIN
。它们应该是枚举。然后,在您的userdetailsiml
中有一些在会话期间很重要的字段-记录的用户UUID、姓名、电子邮件和一些界面所需的字段-是AccountLocked
、isPasswordExpired
等,您还需要一个权限集合,您将通过某种方法返回这些权限
您将能够在代码中使用hasprole
。更酷的是,您还可以从上下文中获取应用程序中记录的用户详细信息。如果您不想涉及Spring Security,您可以添加一个拦截器来拦截所有请求
public class SessionCheck extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return exists(request.getSession());
}
}
如果不想涉及Spring安全性,可以添加一个拦截器来拦截所有请求
public class SessionCheck extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return exists(request.getSession());
}
}
我没有实例变量/enum作为角色。登录对象具有用户id。登录后,我检查用户对象(从db获取)是否是类Admin的实例,然后相应地路由它。我能用这种方法做些类似的事情吗?@ShashankRaghunath好的,主题相当广泛,但我会在稍后的回答中为您描述它。我没有实例变量/enum作为角色。登录对象具有用户id。登录后,我检查用户对象(从db获取)是否是类Admin的实例,然后相应地路由它。“我能用这种方法做些类似的事情吗?”@ShashankRaghunath好的,主题相当广泛,但我会在一分钟后的回答中为你描述它