封装Shiro主题

时间:2013-03-12 14:34:10

标签: java security servlets shiro

我想将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);
        ...
    }
}

MyUser.java

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

2 个答案:

答案 0 :(得分:0)

我不明白你为什么要这样做,但为了你的问题,这没关系。

在网络环境中,Shiro的SecurityUtils#getSubject()会根据请求返回不同的Subject个实例。显然,如果主题已登录,则凭证将从(从会话)复制到新的Subject实例。通过在每次调用MyUser时返回一个新的getUser()实例,您几乎都在做同样的事情。

但是要小心,如果您在同一个请求中拨打getUser()两次,您将获得一个不同的MyUser实例。但是,内部Subject将是相同的。如果您在MyUser课程中进行逻辑而不是委托,则可能会出现问题。

答案 1 :(得分: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类中。