Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 封装Shiro主题_Java_Security_Servlets_Shiro - Fatal编程技术网

Java 封装Shiro主题

Java 封装Shiro主题,java,security,servlets,shiro,Java,Security,Servlets,Shiro,我想在Servlet环境中封装ApacheShiro。我想创建MySecurityUtils并在静态方法中使用Shiro SecurityUtils.getSubject。我的问题是,在静态方法中使用SecurityUtils.getSubject方法是否正确。这会在多线程servlet环境中导致任何问题吗 MySecurityUtils.java import org.apache.shiro.subject.Subject; import org.apache.shiro.SecurityU

我想在Servlet环境中封装ApacheShiro。我想创建MySecurityUtils并在静态方法中使用Shiro SecurityUtils.getSubject。我的问题是,在静态方法中使用SecurityUtils.getSubject方法是否正确。这会在多线程servlet环境中导致任何问题吗

MySecurityUtils.java

import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;

public class MySecurityUtils {

    public static MyUser getUser() {
        Subject currentUser = SecurityUtils.getSubject();
        MyUser myUser = new MyUser(currentUser);
        ...
    }
}
MyUser.java

public class MyUser {
   // ... constructors
   public boolean isPermitted(..) {subject.isPermitted(...)}
}

我不明白你为什么要这样做,但为了你的问题,这样就好了

在web上下文中,Shiro的
SecurityUtils#getSubject()
为每个请求返回不同的
Subject
实例。显然,如果主题已登录,则凭据将(从会话)复制到新的
主题
实例。通过在每次调用
getUser()
时返回一个新的
MyUser
实例,您也在做同样的事情


但是要小心,如果在同一个请求中调用
getUser()
两次,将得到不同的
MyUser
实例。但是,内部
主题
将是相同的。如果您在
MyUser
类中执行逻辑而不是委派,则可能会出现问题。

在收到Sotirios的反馈后,我将代码更改如下

 public class SecurityHelper {
     public static boolean isAuthenticated(){
      Subject currentUser = SecurityUtils.getSubject();
      return currentUser.isAuthenticated();
     }
     public static void checkPermission(String permissionCode){
          Subject currentUser = SecurityUtils.getSubject();
          currentUser.checkPermission(permissionCode);
     }
     public static void checkPermission(String... permissionCodes){
          Subject currentUser = SecurityUtils.getSubject();
          currentUser.checkPermissions(permissionCodes);
     }
     ... and so on

我将所有应用程序逻辑封装在一个Helper类中。

我想向MyUser对象添加额外的特定于应用程序的检查。MyUser将是不可变的,Subject方法的方法将通过delagate方法进行访问。我认为在这种情况下,它会很好,或者?因为您每次都从
MySecurityUtils
类返回一个新实例,如果您需要在每个请求中多次获取用户,请小心。您将在不同的
MyUser
实例上操作。