Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC-会话验证的正确方法_Java_Spring Mvc_Spring Boot_Spring Security - Fatal编程技术网

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好的,主题相当广泛,但我会在一分钟后的回答中为你描述它