0

我想将 Apache Shiro 封装在 Servlet 环境中。我想创建 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);
        ...
    }
}

我的用户.java

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

2 回答 2

0

我不明白您为什么要这样做,但是为了您的问题,这很好。

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

不过要小心,如果你getUser()在同一个请求中调用两次,你会得到一个不同的MyUser实例。但是,内部Subject将是相同的。如果您在MyUser课堂上进行委派以外的逻辑,则可能会出现问题。

于 2013-03-12T14:59:37.127 回答
0

在 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 类中。

于 2013-03-13T08:00:35.400 回答