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)处作判断的话就说他没权限访问了。

 

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

 

相关文章推荐

蓝屏代码分析

  • 2016年04月30日 21:26
  • 15KB
  • 下载

ucoss中os-tmr.c中的代码分析

  • 2017年07月21日 14:40
  • 51KB
  • 下载

GPUImage滤镜中的shader代码分析,及自定义滤镜

GPUImage由于使用GPU,顾其在滤镜真正使用的是

主机代码分析COPYBOOK长度计算

  • 2013年09月17日 22:22
  • 543KB
  • 下载

ARM启动代码分析

  • 2013年12月20日 09:48
  • 99KB
  • 下载

ffmpeg代码分析(1)--编译裁剪

我们很少使用到ffmpge完整的功能库,大部分时候,只需要特定的编解码 传输协议,那么该怎么裁剪ffmpeg呢?答案就是configure命令。...
  • ddr77
  • ddr77
  • 2016年09月13日 13:59
  • 1348

Lucene 3.0 原理与代码分析

  • 2014年03月02日 22:42
  • 10.61MB
  • 下载

Lucene 3.0 原理与代码分析

  • 2013年05月19日 18:22
  • 4.78MB
  • 下载

UCOSII在CORTEX M3上的任务切换汇编代码分析

1.UCOSII的任务切换代码如下:

webkit相关代码分析资料

  • 2013年03月24日 19:40
  • 40MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:springsecurity2.0.6代码分析成果
举报原因:
原因补充:

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