权限控制中,subject可能不会简单的对应于userId, 而是包含一系列的security token或certificate,
例如用户登陆地址,登陆时间等。一般情况下,这些信息在权限系统中的使用都是很直接的,不会造成什么问题。
subject域中最重要的结构是user和role的分离,可以在不存在user的情况下,为role指定权限。有人进一步定义了userGroup的
概念,可以为userGroup指定role,而user从其所属的group继承role的设置。一般情况下,我不提倡在权限系统中引入
userGroup的概念。这其中最重要的原因就是它会造成多条权限信息传递途径,从而产生一种路径依赖,
并可能出现信息冲突的情况。一般user与group的关联具有明确的业务含义,因而不能随意取消。如果我们希望对user拥有的权限进行细调,除去
user从group继承的某个不应该拥有的权限,解决的方法很有可能是所谓的负权限,即某个权限条目描述的是不能做某某事。负权限会造成各个权限设置之
间的互相影响,造成必须尝试所有权限规则才能作出判断的困境,引出对额外的消歧策略的需求,这些都极大的限制了系统的可扩展性。在允许负权限的环境中,管
理员将无法直接断定某个权限设置的最终影响,他必须在头脑中完成所有的权限运算之后才能理解某用户最终拥有的实际权限,如果发现权限设置冲突,管理员可能
需要多次尝试才能找到合适方案。这种配置时的推理需求可能会增加配置管理的难度,造成微妙的安全漏洞,而且负权限导致的全局关联也降低了权限系统的稳定
性。我更倾向于将group作为权限设置时的一种辅助标记手段,系统中只记录用户最终拥有的角色,即相当于记录用户通过group拥有权限的推导完成的结
果,
如果需要权限细调,我们直接在用户拥有的角色列表上直接进行。当然,如果实现的复杂一些,权限系统对外暴露的接口仍然可以模拟为能够指定
userGroup的权限。
推理在面向对象语言中最明显的表现是继承,所以有些人将subject域中的推理直接等价于role之间的继承问题,这未必是最好的选择。继承可以形成非
常复杂的推理关系,但是可能过于复杂了(特别是直接使用sql语句无法实现树形推理查询)。按照级列理论,从不相关发展到下一阶段是出现简单的序关系,即
我们可以说subject出现级别上的差异,高级别subject将自动具有低级别的权限。一种选择是定义roleRank,规定高级别role自动具有
低级别role的权限,但考虑到user与role的两分结构,我们也可以同时定义userRank和roleRank,规定高级别user自动具有低级
别的role,而role之间不具有推理关系。在面向对象领域中,我们已经证实了完全采用继承来组织对象关系会导致系统的不稳定,所以我倾向于第二种选
择,即将role看作某种类似于interface的东西,一种权限的切片。为了进一步限制这种推导关系,我们可以定义所谓的安全域的概念.
security domain, 规定推导只能在一定的域中才能进行。
select user.userId, role.roleId
from user, role
where user.userRank > role.roleRank
and user.domain = role.domain
将权限控制一般需要施加在最细的粒度上,这在复杂的系统中可能过于理想化了。复杂的情况下我们需要进行局部化设计,即进行某些敏感操作之前进行一系列复杂
的权限校验工作。当完成这些工作之后,进入某个security zone, 在其中进行操作就不再需要校验了。
总的来说,权限系统采用非常复杂的结构效果未必理想。很多时候只是个管理模式的问题,应该尽量通过重新设计权限空间的结构来加以规避。不过在一些非常复杂
的权限控制环境下,也许简单的描述信息确实很难有效的表达权限策略(虽然我从未遇到过),此时尝试一下规则引擎可能比在权限系统中强行塞入越来越多的约束
要好的多。
分享到:
相关推荐
在现代软件系统中,权限控制是一项重要的安全措施,它确保只有经过适当验证和授权的用户才能访问特定资源或执行特定操作。权限控制通常包括两个核心方面:认证(Authentication)和授权(Authorization)。 1. **认证**...
### 软件测试QC导入用例使用教程 #### 一、引言 在软件测试领域,使用质量中心(Quality Center,简称QC)作为测试管理工具是非常常见的实践。QC不仅能够帮助团队有效地组织和跟踪测试活动,还能促进跨部门间的...
- **权限(function)**:表示系统中允许访问的功能,如取派员查询、区域导入等,具有ID、名称、代码和描述。 - **角色(role)**:权限的集合,方便授权,角色与用户之间是多对多关系,角色与权限也是多对多关系。 ...
3. **Enforcer(执行器)**:Enforcer负责加载模型和策略,并执行权限判断。当一个主体尝试访问一个资源时,执行器会根据模型和策略决定是否允许。 4. **支持多种访问控制模型**:Casbin不仅支持基本的RBAC(Role-...
Shiro提供了`subject.hasRole()`和`subject.isPermitted()`等API,用于判断当前用户是否具有某个角色或权限,以此决定是否执行某项操作。 综上所述,"ssm+shiro实现权限框架"是一个综合运用Spring、SpringMVC、...
验证成功后,Shiro会创建一个Subject对象来代表当前用户,并将用户角色和权限信息存储在会话中。之后,Shiro通过对请求URL的拦截,根据用户的权限信息决定是否允许访问特定资源。 Eclipse作为一个集成开发环境(IDE...
这个压缩包包含的是版本为2.0.5的ses_email_forwarding库,适用于Python 3解释器,且不依赖于特定的系统架构("none-any"部分表示此轮子文件可以在任何平台上运行)。在Python生态系统中,".whl"文件是一种预编译的...
3. Realm:连接数据源(比如数据库)的桥梁,它可以为Subject和SecurityManager提供用户及权限信息。 Shiro的认证操作主要涉及到几个步骤: 1. 引入Shiro的坐标依赖到Maven项目中。 2. 定义一个自定义的Realm,继承...
1. **-import**: 导入数据。 2. **-install**: 安装 Zurmo。 3. **-installlanguage**: 安装语言包。 4. **-jobmanager**: 管理任务。 5. **-lesscompiler**: 编译 LESS 文件。 6. **-managemetadata**: 管理元数据...
3. **定义关系**:使用 n-m 关系连接线连接 Student 表和 Subject 表。 4. **自动生成中间表**:工具将自动生成中间表来表示多对多关系。 5. **导出 SQL 脚本**:将设计好的模型导出为 SQL 脚本,并在数据库中执行以...
3. **权限表 (permissions)** - `id`: 权限ID,主键。 - `code`: 权限代码,比如"admin:user:create"表示管理员可以创建用户。 4. **用户角色关联表 (user_roles)** - `user_id`: 用户ID,外键关联用户表。 - `...
考虑到学生管理可能涉及隐私,开发者可能对应用进行了权限控制,例如请求读写外部存储的权限以便备份和恢复数据,或者请求访问联系人权限以导入导出学生信息。同时,为了保护数据安全,敏感信息可能进行了加密存储。...
- 在实际项目中,Shiro可以用来保护REST API、控制后台管理系统权限、防止CSRF攻击等。 - 结合Spring Security,可以构建更复杂的权限管理体系,满足企业级应用的需求。 通过以上知识点的学习和实践,开发者可以...
通过以上设计,我们可以实现NOTES邮件系统与OA系统的无缝集成,使得邮件中的信息能够准确无误地导入到OA系统中,提升企业的信息流转效率,同时也保证了数据的一致性和完整性。这种设计方法灵活且实用,为不同平台间...
3. 测试权限:创建不同的用户角色和权限,尝试不同的访问组合,观察Shiro如何根据注解进行权限控制。 通过这个Demo,你不仅可以了解Shiro的基本用法,还能深入了解其在实际项目中的应用,为你的Java开发工作提供...
开发者可以通过下载 "shiro-demo" 文件,导入到 IDE 中运行,查看其如何处理登录、权限检查等操作。通过阅读代码,可以了解 Shiro 如何与后端控制器、数据库及前端交互,从而在自己的项目中应用类似的安全机制。 ...
系统管理员则拥有更全面的权限,包括对学生和教师信息的增删改查,以及数据库的备份和恢复。系统主要用于教育环境,旨在提升教务管理效率,减少人力成本,加速信息查询,并促进教育信息化。 功能分析中,系统被划分...
在Shiro框架中,Ehcache可以作为Session管理的缓存 provider,存储用户会话信息,或者作为权限控制的数据缓存,存储用户的权限信息。 集成Shiro和Ehcache的步骤通常包括以下几个部分: 1. 添加依赖:首先,在项目...
3. **commit message示例**: - `feat(动态模型): 添加动态页签、动态模型功能` - `fix(配方*流程*实验): 修复创建配方属性显示的问题#1021` - `style(权限管理): 修改权限相关工具类的注释` - `refactor(配方*...