springsecurity2.0.6代码分析成果

2023-11-02

之前也试着玩过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)处作判断的话就说他没权限访问了。

 

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springsecurity2.0.6代码分析成果 的相关文章

  • MVC Owin Identity 2 CheckPasswordAsync() 将不会执行

    我有两个问题似乎彼此相关 并且 stackoverflow 中的其他重复项都不能回答我的问题 First当 的时候PasswordSignInAsync方法执行它永远不会停止或抛出任何异常它只是继续执行 var result await S
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • 瓦廷 Windows 身份验证

    我正在尝试为使用集成身份验证的 Intranet 应用程序编写 Watin 测试 我尝试测试的网页打印 Page User Identity Name 这是我测试的一些代码 if Win32 LogonUser u UserName u D
  • 我怎样才能制作自己的惰性迭代器?

    我正在创建一个生成大量数据的 C 11 类 该数据当前来自数据库 无法完全放入内存中 我想为用户提供一个行为类似于常规 STL 迭代器的迭代器 但这会很懒 更准确地说 我可以做这样的事情 for auto item big bunch of
  • DMARC/SPF/DKIM 未使用第三方邮件进行身份验证

    我们最近为我们的域实施了 DMARC 记录 v DMARC1 p 隔离 pct 100 rua mailto 电子邮件受保护 cdn cgi l email protection 隔离 100 未经身份验证的电子邮件并将汇总报告发送给 我
  • 在浏览器上验证 JWT

    我一直在读关于JWT https jwt io 我知道它分为三个部分 即header payload and signature 我将哈希算法保留在标头中 将基本信息保留在有效负载中例如 姓名 年龄 职务 有效期等在有效负载中 然后这两个都
  • 使用 Wordpress 验证 Flask API

    我有两个网站 一个托管大部分内容的 WordPress 博客 我还用 Flask 编写了一个 API 我想在 Wordpress 受密码保护的页面 中使用 API 但我需要在 Flask 响应之前验证请求是否经过身份验证 当我收到对 Fla
  • 内部注册 vs. OpenID vs. Google Friend Connect vs. Facebook Connect vs.(等等)

    我正在尝试决定如何允许用户注册我的网站 有 openID clickpass facebook connect googlefriendconnect 等 或者是老式的内部 输入用户名 电子邮件 密码等 简要地看一下如何设置 OpenID
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • removeIf 实现细节

    我有一个我无法理解的小实施细节问题ArrayList removeIf 我认为我不能在没有先决条件的情况下简单地这么说 因此 实施基本上是bulk remove 不像ArrayList remove 一个例子应该会让事情更容易理解 假设我有
  • WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”是什么?

    假设我有一个 NET 富客户端 WPF 应用程序 它将同时部署在 3 个不同的场景中 客户端和服务器代码在单个进程中运行 客户端代码在 Intranet 计算机上运行 并通过 WCF 与运行应用程序 域 基础设施代码的服务器计算机进行通信
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 如何通过 javascript 和 ajax 调用 Scala 中的方法?

    我不知道我的标题是否有点误导 但这是我真正需要帮助的 我正在获取这个网址 get fb login fbEmail function data console log data 这是我的路线 GET fb login email prese
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • “WSGIRequest”对象没有属性“successful_authenticator”

    我已经创建了一个像这样的身份验证类 RESTful API 的令牌身份验证 是否应该定期更改令牌 https stackoverflow com questions 14567586 token authentication for res
  • python:API 令牌生成及其危险

    我正在按照 Flask Web Development 一书来实现基于令牌的身份验证 基本上 用户使用 HTTP 基本身份验证对其进行身份验证 并为其生成令牌 s Serializer app config SECRET KEY expir
  • TortoiseSVN 不要求身份验证?

    我已经在conf文件中设置了一个新的SVN存储库 运行SVNServe anon access none SVNServe 忠实地正确地做到了这一点 但是当我尝试使用 TortoiseSVN 浏览存储库时 它只是说不允许访问 它不应该要求我
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • 为 NFL api 生成访问令牌

    NFL 有一个 API 服务 link https api nfl com docs getting started index html https api nfl com docs getting started index html
  • 如果用户在 Laravel 中经过身份验证,如何检查 Vue 组件?

    正如标题所述 我有点困惑如何根据用户是否登录并使用 Laravel 的 Auth 外观进行身份验证 使用 if else 语句处理 Vue 组件中的方法 我正在发出各种 Axios 请求 我需要根据用户是否登录来允许 禁止这些请求 我有 V

随机推荐

  • 经典的ABA问题与解决方法

    1 AbA问题的产生 要了解什么是ABA问题 首先我们来通俗的看一下这个例子 一家火锅店为了生意推出了一个特别活动 凡是在五一期间的老用户凡是卡里余额小于20的 赠送10元 但是这种活动没人只可享受一次 然后火锅店的后台程序员小王开始工作了
  • C语言中的二级指针(双指针)

    原创作品 转载请标明出处 http blog csdn net yming0221 article details 7220688 C语言更多查看 C语言使用注意事项 一 C语言使用注意事项 二 C语言使用注意事项 三 二级指针又叫双指针
  • el-table实现自适应高度滚动,并处理fixed的问题

    需求 页面只有一页 不能滚动 需要对长的table在内部设置滚动 设置Scss el table自身拥有 flex 1 这项css规则 需要先为table的父级容器设置display flex flex direction column 这
  • iOS音视频—目录

    What you cannot avoid welcome 无法避免的事 就坦然接受 OpenVC iOS音视频 OpenCV初体验马赛克的实现 Shell脚本语言 基础 iOS音视频 Shell脚本语言 第一个脚本应用 iOS音视频 Sh
  • 机器学习(九)------K-Means实现鸢尾花聚类

    机器学习 九 无监督K Means聚类 1 K Means聚类算法流程 误差平方和准则函数 2 K Means实现鸢尾花聚类 import numpy as np import pandas as pd import matplotlib
  • 一文告诉你如何在Linux中设置定时清除运行内存(buff_cache)的脚本

    一文告诉你如何在Linux中设置定时清除运行内存 buff cache 的脚本 前语 1 查看内存缓存状态 2 配置清理缓存的脚本 2 1 新建或打开脚本 2 2 clear buff cache配置文件中增加如下代码 3 设置定时任务 大
  • 最新Web前端面试题精选大全及答案

    目录 HTML CSS相关 Javascript相关 三者的异同 Vue相关 55 Vue路由懒加载 按需加载路由 React相关 react 生命周期函数 为什么虚拟 dom 会提高性能 必考 组件的 状态 state 和属性 props
  • Kali-工具-sqlmap常见用法

    SQLmap常见用法 r 这个参数是将 抓到的请求包复制一个文件中然后使用此参数进行扫描 get post提交方法都支持 例如 rp txt 是抓取的数据包 sqlmap r rp txt 也可以加 p 指定注入点 sqlmap r rp
  • Element UI的表单验证

    Element UI表单有3种验证方式 1 在表单中加rules属性 然后data里面写具体的验证规则就好 rules里面可以写正则表达式验证
  • 《因果推断入门》总结

    内容来源 饺子博士and饭老师 目录 一 概率统计基础工具 二 图模型 三 结构因果模型 四 辛普森悖论 五 D 分隔 六 模型检验和等价类 七 乘积分解法则 八 混淆变量 九 A B test 十 总结 一 概率统计基础工具 1 随机事件
  • mission planner SITL仿真系统配置

    背景 主要参考ArduPilot的官网 作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者微信 欢迎添加交流 链路图 图源 Cygwin 下载 去官网下载Cygwin 作者电脑windows 10 64位
  • LeetCode146- LRU 缓存

    class LRUCache public struct Node int key val Node left right Node int key int val key key val val left NULL right NULL
  • elasticsearch入门

    elasticsearch 基础 创建客户端 public class HelloElasticsearch public static void main String args throws IOException 创建客户端对象 Re
  • vue项目播放H.265编码视频流

    vue项目播放H 265编码视频流 问题 目前使用的video js video player 不支持对H 265的视频格式的支持 1 在有的摄像头配置里面是可以设置H 264还是H 265 如下图所示 针对H 265的视频流的解决方案可用
  • cp: cannot stat ‘xxx.dcm‘: No such file or directory

    背景 ubuntu16 0 4系统使用cp命令拷贝软链接文件时 报上述错误 在待拷贝文件夹内使用 ls l 命令查看文件形式 如下 lrwxrwxrwx 1 root root 166 8月 16 2021 xxx dcm gt data
  • 华为云云耀云服务器L实例评测|基于云耀云服务器在Docker上部署nginx服务

    文章目录 1 服务介绍 云耀云服务器 Docker介绍 Docker Compse介绍 2 在云耀云服务器安装Docker 3 通过Docker run命令运行nginx服务 4 在云耀云服务器安装docker compose 5 通过do
  • IDEA中 Ctrl+ALT+V这个快捷键无法使用

    这个是由于快捷键冲突造成的 所以可以查应用 比如 1 搜狗输入法中设置的语句 2 QQ音乐的快捷键 3 有道词典的快键键 把上面找的快键键删除 那么在IDEA里面就可以使用了 若是查询的时候出现下图时 那么就是可以使用了
  • 移除元素

    题目 给定一个数组 nums 和一个值 val 你需要
  • 智慧灌区闸控一体化解决方案

    智慧灌区闸控一体化解决方案是指将灌溉系统中的闸门控制与水文监测 远程通信和数据管理等功能相集成 实现对灌区水资源的智能化管理和控制的方案 以下是智慧灌区闸控一体化解决方案的主要组成部分 闸门控制系统 包括闸门 闸门执行器和控制器等设备 闸门
  • springsecurity2.0.6代码分析成果

    之前也试着玩过springsecurity 这回把它搬到项目中 却遇到了意想不到的麻烦 我定义了一些角色与资源 下表显示了它们的情况 Loginer Role Resource Description admin ROLE ADMIN ac