【问题标题】:How can I check Shiro permissions for list of elements?如何检查 Shiro 权限以获取元素列表?
【发布时间】:2012-05-23 03:15:51
【问题描述】:

我有 Hibernate 请求,它返回要显示的元素列表。我需要检查当前用户是否能够查看每个返回的元素。我可以这样做

for (Element e : elements) { 
    SecurityUtils.getSubject().hasPermission("element:view:" + e.id);   
}

但此代码将为每个元素生成 x 个对数据库的请求。所以检查的速度将是O(n)。

如何改进我的解决方案?是否有可能获得速度 O(1)?

【问题讨论】:

    标签: java grails shiro


    【解决方案1】:

    根据您的示例,您可能想要执行以下操作:

    String[] permissions = new String[elements.size()];
    
    for (int i = 0; i < elements.size(); i++) {
        permissions[i] =  "element:view:" + e.id;
    }
    
    boolean[] allowed = SecurityUtils.getSubject().isPermitted(permissions);
    
    List<Element> allowedElements = new ArrayList<Element>();
    
    for (int i = 0; i < elements.size(); i++) {
        //1:1 match on entries in allowed to elements
        if (allowed[i]) {
            allowedElements.add(elements[i]);
        }
    }
    
    //allowedElements now contains the set of elements the user is permitted to access
    return allowedElements;
    

    我使用的 Subject API 方法在这里:boolean[] isPermitted(String... permissions)

    这种方法的缺点是您实际上最终会迭代您的元素列表两次。但是,由于您不必为每个元素进行数据库调用,因此您最终会节省。

    需要注意的是,您的运行时间可能会根据您的安全性Realm 的实施方式而改变。

    【讨论】:

      【解决方案2】:

      shiro 支持缓存,如果你这个列表构造很多,你可以使用这种类型的动作。 http://shiro.apache.org/caching.html

      【讨论】:

        【解决方案3】:

        Subject 上有一个名为 isPermittedAll(String ...) 的方法,如果 Subject 拥有所有权限,它将返回 true

        见:http://shiro.apache.org/static/current/apidocs/org/apache/shiro/subject/Subject.html#isPermittedAll%28java.lang.String...%29

        不过,老实说,我不知道它在 db 查询方面的效率有多高(如果有的话)。

        【讨论】:

        • 我需要过滤元素。我认为如果用户无权访问 1 个元素 isPermittedAll 将为所有元素返回 false
        猜你喜欢
        • 2021-07-30
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多