戴老师的博客 - 权限
type: channel
link: https://tushu.info/tag/%E6%9D%83%E9%99%90/
items: 基于 RBAC 的 Web Security Framework 的研究与应用
items: Spring Security 入门原理及实战

基于 RBAC 的 Web Security Framework 的研究与应用
type: item
date: 2026-07-09T04:36:20+00:00
description: 访问控制与 RBAC 模型访问控制通常的多用户系统都会涉及到访问控制（Access Control）。所谓访问控制，是指通过某种方式允许或限制用户访问能力及范围的一种方法。这主要是由于系统需要对关键资源进行保护，防止由于非法入侵或者误操作对业务系统造成破坏。简而言之，访问控制即定义哪些用户可以访问哪些资源。一般而言，访问控制系统包括三个组成部分：主体（Subject）：发出访问请求的实体，通常指用户或者用户进程。客体（Object）：被保护的资源，通常是程序、数据、文件或者设备。访问策略（Access Policy）：主体和客体的映射规则，确定一个主体是否对客体具有访问能力。RBAC 模型基于角色的访问控制（Role-Based Access Control, RBAC）的概念在七十年代就已经提出，但是直到九十年代由于安全需求的发展才又引起了广泛关注。RBAC 的核心思想是将系统资源的访问权限进行分类或者建立层次关系，抽象为角色的概念，然后根据安全策略将用户和角色关联，从而实现了用户和权限之间的对照。RBAC 通过引入角色并将其作为权限管理的中介，将访问控制系统分为两个部分，即权限与角色的关联和角色与用户的关联，具有灵活易控制的优点。RBAC 模型的建立和实现是基于角色实现访问控制研究中的两大热点。RBAC96 模型因全面系统地描述了多层次的含义而得到广泛认可。美国国家标准技术协会（NIST）基于 RBAC96 制定了 RBAC 标准，将 RBAC 主要分为：Core RBAC、Hierarchical RBAC、Constraint RBAC。RBAC96 模型包含 4 个层次，如图 1 所示：图 1. RBAC96 模型其中：RBAC0：包含 RBAC 的核心部分即 Core RBAC，是最基本的模型，仅包含基本的 RBAC 元素，即用户、角色、权限、会话。角色之间是平级关系，对象之间没有附加的约束。RBAC1：在 RBAC0 的基础上定义了角色继承关系。RBAC2：同样包含了 RBAC0，并且定义了约束，实际中需要考虑的常见的约束包括角色互斥和角色基数两种。RBAC3：包含了 RBAC1 和 RBAC2，即既有角色的继承关系，又包含约束关系，是最复杂的一种模型。图 2 清晰描述了 RBAC 模型中的用户、角色、权限、继承关系及约束关系。图 2. RBAC 模型关系图约束是 RBAC 的一个重要组成部分，比较常见的约束包括：互斥角色约束：指的是同一用户只可以分配到互斥角色集合中最多一个角色，以支持“职责分离”的原则。必备角色约束：也称为先决条件约束，是定义在用户角色分配关系（UA）和权限角色分配关系（PA）上的重要约束，是指所分配的角色或者权限依赖于另外一种角色或者权限。基数约束：同样也是定义在 UA 和 PA 上的约束，规定了一个角色可以被分配的最大用户数或者一项权限可允许分配的角色数目，从而来控制高级权限在系统中的分配。流行的 Web 安全框架随着网络应用的不断发展，越来越多的应用系统开始移植到 Web 环境，并且具有不同程度的访问控制的需求。随着这种需求的积累，出现了很多基于 RBAC 的 Web 访问控制框架。这些框架的核心理论就是 RBAC，并且为开发人员提供了方便的接口来完成定制化的需求。Membership in ASP.NETASP.NET 中提供了非常好的用户身份认证的管理框架——Membership，提供的功能包括创建新用户、身份认证、密码管理等。默认情况下，ASP.NET Membership 可以支持所有的 ASP.NET 应用程序，并提供了非常友好的使用方式，甚至提供了向导来创建所需要的数据结构——aspnet_regsql.exe。图 3. Membership 数据模型.NET 平台的易用性毋庸置疑，开发者只需要配置 web.config 文件，引入 authentication 配置，增加 membership 节点，再配置其角色管理 roleManager 基本上就完成了对 Membership 的引用。并且 .NET 甚至提供了用户控件 login 和 createUserWizard 等，通过属性的简单配置即可激活 Membership 的认证，完成创建用户的功能等等。本文中的企业应用没有基于 .NET 平台的 Membership 来实现，因此 Membership 并不是本文的重点，不再赘述。Spring Security in JavaJava Web 开发领域中的用于进行认证授权的框架为数众多，单就从 RBAC 的角度而言，Spring Security 已经占据重要的地位，并且被越来越广泛地应用在各种 Web 系统中，为基于 J2EE 企业应用软件提供了全面安全服务。Spri…

Spring Security 入门原理及实战
type: item
date: 2026-07-09T04:33:26+00:00
description: 目录从一个 Spring Security 的例子开始创建不受保护的应用加入 Spring Security 保护应用关闭 HTTP Basic，使用 Form 表单页面登录角色 - 资源访问控制获取当前登录用户信息小结Spring Security 核心组件SecurityContextSecurityContextHolderAuthenticationUserDetailsUserDetailsServiceAuthenticationManager小结Spring Security 的一些工作原理Spring Security 在 Web 应用中是基于 Filter 的DelegatingFilterProxySpring Security 入口——springSecurityFilterChainFilterChainProxy 和 SecurityFilterChain小结再说 SecurityFilterChainSpring Security 的一些实战通过数据库查询、存储用户和角色实现安全认证添加 Spring Data JPA，创建数据表，并添加数据自定义 UserDetailsService验证效果Spring Security Session 无状态前后端分离应用中自定义 Token 整合 Spring Security总结在 Web 应用开发中，安全无疑是十分重要的，选择 Spring Security 来保护 Web 应用是一个非常好的选择。Spring Security 是 Spring 项目之中的一个安全模块，可以非常方便地与 Spring 项目无缝集成。特别是在 Spring Boot 项目中加入 Spring Security 更是十分简单。本篇我们介绍 Spring Security，以及 Spring Security 在 Web 应用中的使用。说明：本文最初发表之时，使用的是 Spring Boot 1.x 的版本。Spring Boot 2.x 版本之后有些不同，2019 年 12 月 18 日有稍微补充。同时也补充了可以运行的实例源码，基于 Spring Boot 2.1.8.RELEASE。从一个 Spring Security 的例子开始创建不受保护的应用假设我们现在创建好了一个 Spring Boot 的 Web 应用。如果没有的话，可以在这里下载代码：GitHub 示例代码 (springboot2.x)。其中有一个控制器如下：@Controller public class AppController { @RequestMapping("/hello".html) @ResponseBody String home() { return "Hello ,spring security!"; } }我们启动应用，假设端口是 8080，那么当我们在浏览器访问 http://localhost:8080/hello 的时候，可以在浏览器看到 Hello ,spring security!。加入 Spring Security 保护应用此时，/hello 是可以自由访问的。假设我们需要具有某个角色的用户才能访问，我们可以引入 Spring Security 来进行保护。加入如下依赖，并重启应用：<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>再次访问 /hello，我们可以得到一个 HTTP Basic 的认证弹窗，如下：说明 Spring Security 已经起作用了。如果我们点击取消，则会看到错误信息，如下所示：There was an unexpected error (type=Unauthorized, status=401.html).2019 年 12 月补充说明：升级 Spring Boot 到 2.x 之后，没有这个 HTTP Basic 的弹窗了，这个后面说。关闭 HTTP Basic，使用 Form 表单页面登录我们在实际项目中不可能会使用上面 HTTP Basic 方式的弹窗来让用户完成登录，而是会有一个登录页面。所以，我们需要关闭 HTTP Basic 的方式。关闭 HTTP Basic 方式的认证弹窗的配置如下（针对 Spring Boot 1.x）：security.basic.enabled=falseSpring Security 默认提供了表单登录的功能。我们新建一个类 SecurityConfiguration，并加入一些代码，如下所示：@C…