首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >封装Shiro主题

封装Shiro主题
EN

Stack Overflow用户
提问于 2013-03-12 22:34:10
回答 2查看 705关注 0票数 0

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

MySecurityUtils.java

代码语言:javascript
复制
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

代码语言:javascript
复制
public class MyUser {
   // ... constructors
   public boolean isPermitted(..) {subject.isPermitted(...)}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 16:00:35

在得到Sotirios的反馈后,我按如下方式更改了代码

代码语言:javascript
复制
 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类中。

票数 0
EN

Stack Overflow用户

发布于 2013-03-12 22:59:37

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15364126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档