springsecurity2.0.6代码分析成果

原创 2011年01月17日 16:44:00

之前也试着玩过springsecurity,这回把它搬到项目中,却遇到了意想不到的麻烦。我定义了一些角色与资源,下表显示了它们的情况:

 

Loginer        Role                     Resource                    Description

admin          ROLE_ADMIN        /*/*.action                   能访问所有的action资源

user             ROLE_USER          /index/index.action       仅能访问去首页的那个action

 

假设登录后就访问/index/index.action。我的目的是以admin登录的用户,它具有管理者的角色,并能访问所有的action资源;而以user登录的用户只能访问去首页的那个action资源。所以无论谁登录,都应该可以访问 /index/index.action资源。结果只有其中一个能成功!

 

先看一下用于判断是否有权限访问资源的那个类及相关代码:

package org.springframework.security.intercept.web;

....

public class DefaultFilterInvocationDefinitionSource implements FilterInvocationDefinitionSource {

....

    private ConfigAttributeDefinition lookupUrlInMap(Map requestMap, String url) {
        Iterator entries = requestMap.entrySet().iterator();

        while (entries.hasNext()) {
            Map.Entry entry = (Map.Entry) entries.next();
            Object p = entry.getKey();    //这个相当于Resource
            boolean matched = urlMatcher.pathMatchesUrl(p, url);

            if (logger.isDebugEnabled()) {
                logger.debug("Candidate is: '" + url + "'; pattern is " + p + "; matched=" + matched);
            }

            if (matched) {

                //如果用户访问的资料与requestMap内定义的Resource匹配,就返回这个资源对应的所有角色。

               //因为while循环,并且找到匹配后就返回,所以就永远只返回第一条匹配的Resource对应的所有角色了。

                return (ConfigAttributeDefinition) entry.getValue(); ****(1)
            }
        }

        return null;
    }

....

}

 

 

package org.springframework.security.vote;

....

  public class RoleVoter implements AccessDecisionVoter {

....

    public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
        int result = ACCESS_ABSTAIN;
        Iterator iter = config.getConfigAttributes().iterator();    //此迭代器的内容就是上边返回的匹配与当前请求的所有角色
        GrantedAuthority[] authorities = extractAuthorities(authentication);    //当前登录者拥有的所有角色

        while (iter.hasNext()) {
            ConfigAttribute attribute = (ConfigAttribute) iter.next();    //迭代器里的每个角色

            if (this.supports(attribute)) {
                result = ACCESS_DENIED;

                //如果当前登录都其中一个角色与当前请求匹配的其中一个角色对应,就允许访问。

                ****(2)
                for (int i = 0; i < authorities.length; i++) {
                    if (attribute.getAttribute().equals(authorities[i].getAuthority())) {

 

                        return ACCESS_GRANTED;
                    }
                }
            }
        }
        return result;
    }

....

  }

 

所以,结论如下:

在(1)处,如果第一条匹配的Resource对应的角色是ROLE_ADMIN,用user来登录的话,虽然他能够访问 /index/index.action,但user的角色是ROLE_USER,所以(2)处作判断的话就说他没权限访问了;

在(1)处,如果第一条匹配的Resource对应的角色是ROLE_USER,用admin来登录的话,虽然他能够访问 /index/index.action,但admin的角色是ROLE_ADMIN,所以(2)处作判断的话就说他没权限访问了。

 

最后的教训是,在定义资源的时候,不同的资源必须互不相干,如果象我上边那样一个资源能匹配另一个,就会出现无权访问资源的后果了。

 

大数据成果(发展和未来)

/////////////////////世界就是数据///////////// 以云计算为基础的信息存储、分享和挖掘手段,可以便宜、有效地将这些大量、高速、 多变化的终端数据存储下来,并随时进行分析...
  • qq_33785671
  • qq_33785671
  • 2016年09月01日 03:40
  • 441

项目的可交付成果有哪些?具备什么特性?

项目的可交付成果有哪些?这些可交付成果有什么特性?
  • liantingwqn
  • liantingwqn
  • 2016年03月15日 12:25
  • 4492

我的第二次软件测试基础成果汇报

第一阶段已经结束,开始了第二阶段的学习。通过第一阶段的学习,已经对软件测试有了初步的了解。第二阶段的开始我应该更加的努力,更好的去学习知识,更全面的要求自己,为了成为一个合格的测试人员时刻学习着,准备...
  • Wisteria_queen
  • Wisteria_queen
  • 2015年10月11日 17:15
  • 514

我的第一次软件测试成果展示

1 知识总结 1.1软件测试管理基本流程   软件测试是软件开发过程中的一个重要组成部分,是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其目的是尽快尽早地发现在软件...
  • Wisteria_queen
  • Wisteria_queen
  • 2015年09月26日 17:27
  • 510

CNKI学者成果库

CNKI学者成果库为学者提供了管理自己的学术成果、自动推送新成果、科学评价学术影响力和构建学术社区的服务;同时支持多种格式的批量导入、导出成果;还可以跟踪同行进展,是学者展示学术成果、扩大学术影响力的...
  • appe1943
  • appe1943
  • 2014年09月17日 11:04
  • 681

国家自然科学基金成果填写经验

1. 信息能查多全就查多全,所有论文都需要上传 2. 检索一定要写,否则后边调整序号那个窗口表格填不满 3. 第一作者需要勾选,本人是指项目负责人 4. 外边的第一作者和通讯作者是否勾选是指,项...
  • Sun7_She
  • Sun7_She
  • 2017年01月12日 15:06
  • 1271

人工智能的主要研究流派和成果(一)

到了20世纪70年代,人工智能研究领域形成三驾马车:卡内基梅隆大学的纽厄尔和西蒙,斯坦福大学的麦肯锡,麻省理工学院的马文.明斯基。 他们分属两个人工智能研究流派,信息计算学派和神经网络学派。 前者着眼...
  • hwcyxp
  • hwcyxp
  • 2017年07月24日 12:26
  • 536

软件需求-理解-开发-成果

一幅挺有意思的图,基本适用于大多数软件项目 
  • fly_cloud
  • fly_cloud
  • 2006年08月22日 13:49
  • 3080

JavaIO流学习成果(工具类)

这两天又把IO相关的过了一遍加深了一下印象,下面是自己写的工具类欢迎批评指正 package com.wangzic.io_tools; import java.io.BufferedWriter...
  • qq_24473141
  • qq_24473141
  • 2016年11月19日 17:13
  • 306

测试成果展示

第一章 1.1软件生命周期:  定义 设计 实施  测试  部署  运行 维护 1.2瀑布模型 需求分析 概要设计 详细设计 编码 测试 运行维护 1.3“V”模型   需求分...
  • lele628
  • lele628
  • 2015年10月13日 21:54
  • 383
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:springsecurity2.0.6代码分析成果
举报原因:
原因补充:

(最多只允许输入30个字)