【问题标题】:Encapsulating Shiro Subject封装 Shiro 主题
【发布时间】:2013-02-28 03:17:30
【问题描述】:

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

【问题讨论】:

    标签: java security servlets shiro


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      但请注意,如果您在同一请求中调用 getUser() 两次,您将获得不同的 MyUser 实例。但是,内部Subject 将是相同的。如果您在 MyUser 类中进行委派以外的其他逻辑,则可能会出现问题。

      【讨论】:

      • 我想向 MyUser 对象添加额外的应用程序特定检查。 MyUser 将是不可变的,并且 Subject 方法的方法将通过 delagate 方法进行访问。我认为在那种情况下会很好,还是?
      • 因为您每次都从 MySecurityUtils 类返回一个新实例,所以如果您需要在每个请求中多次获取用户,请小心。您将在不同的 MyUser 实例上运行。
      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2021-05-14
      • 2014-05-20
      • 1970-01-01
      相关资源
      最近更新 更多