Security 10:权限管理
SQL Server 用于管理权限的TSQL命令有:GRANT用于授予权限,REVOKE 用于移除授予的权限,而DENY用于防止安全主体通过GRANT获得权限。但是,SQL Server的权限管理不是扁平的,是立体的,在不同的安全上下文(Security context)中,不同的权限空间(Permission Space)中,这三个命令的优先级是不同的。
在进行权限管理时,应遵守“最低权限”原则,即每个人只授予必需的最小权限。相对于授予的权限,数据库中还有一个特殊的权限,那就是所有权(Ownship)。
一,管理权限的规则
在管理权限时,要注意权限的上下文、权限的立体空间和权限的优先级
1,安全上下文和权限空间
安全上下文(Security Context),是跟user 或 login 相关的环境,用户可以通过EXECUTE AS 来切换安全上下文。安全上下文主要包括:Login、User、Role membership、Windows Group membership
权限空间,是指安全对象(Securable)和包含安全对象的所有安全对象类(Securable class),比如,表包含在schema 中,schema是表的安全对象类;而database包含schema,database是schema的安全对象类。访问表的权限,受到表、schema和database的权限的影响,这三个对象构成一个权限空间,访问受到权限空间的约束。
2,权限的优先级
当这三个命令作用于同一个安全对象(Securable)时,情况会变得复杂,不仅需要考虑权限空间,还需要考虑权限的优先级。
在同一个安全主体范围内对同一个安全对象设置权限,GRANT子句会移除DENY和REVOKE子句设置的权限,这三个命令的优先级相同,后执行的语句会移除先执行语句的效果。
但是,当相同的权限作用于同一安全主体的不同范围时,如果DENY 作用于更高的范围内,那么DENY优先,但是在更高的范围内,REVOKE不优先。
这里有一个例外,列级别的GRANT语句,会覆盖Object级别的DENY语句,但是后续Object级别的DENY语句会覆盖列级别的GRANT语句。
3,权限的层次结构
权限的层次结构,类似于权限空间,但是权限的层次结构是一种父子结构。
举个例子,数据库级别的权限:
- 在数据库级别授予操作数据库对象的权限,比如 EXECUTE、DELETE、INSERT、SELECT、UPDATE、REFERENCES、VIEW DEFINITION,实际上,授予的是操作数据库中所有对象的权限。
- 数据库级别独有的权限:ALTER、BACKUP DATABASE、BACKUP LOG、CHECKPOINT、CONNECT、CREATE TABLE、CREATE VIEW、CREATE PROCEDURE等
二,权限管理的实现
权限管理涉及到Principal、Securable和Permission三个概念。Principal可以是单个User,也可以是多个User构成的Windows Group;Securable可以是单个数据库对象,也可以是包含多个数据库对象的schema;同时,User也可以通过role获得数据库对象的权限。
第一种方式,为每一个User设置单个Securable的权限

第二种方式,创建Windows Group,为每一个Windows Group设置单个Securable的权限

第三种方式,通过数据库 role来设置权限

第四种方式,通过Schema来设置权限,在一个Schema下包含多个Securables。

三,所有权和所有权链
对象的所有者对一个对象拥有所有可能的权限,并且这些权限不能禁止。CONTROL权限可以执行与对象所有者几乎相同的操作,但是所有权和授权是不同的。对象的所有者通常是其创建者,但是可以在创建时使用AUTHORIZATION子句指定其他所有者,也可以把Ownship转移给其他Principal。
如何在不授予基础表访问权限的情况下,仅对视图或任何其他类型的程序授予SELECT权限呢?答案是使用所有权链(Ownership-chaining)。通常情况下,当用户从视图中查询数据时,系统做两次权限检查,第一次是检查用户是否有权限查询视图,第二次是在视图引用基础表时检查用户是否有权限查询基础表,由于用户没有基础表的权限,因此第二次权限检查失败。
所有权链(Ownership-chaining)通过绕过第二次权限检查来避免这种情况,否则将在视图引用基础表时进行第二次权限检查。当链接的对象(underlying table)与调用对象(view)具有相同的所有者时,权限检查将被完全绕开。
如果一个user在具有Ownership权限的Schema中创建视图,因为它视图的所有者,就是被视图引用的基表的所有者,这是一个链:我是Schema的所有者,那么Schema下的所有对象的Owner都是我,我有权限访问视图,但不能访问基础表。
参考文档:
Schema-Based Access Control for SQL Server Databases
Security 10:权限管理的更多相关文章
- 使用Spring Security实现权限管理
使用Spring Security实现权限管理 1.技术目标 了解并创建Security框架所需数据表 为项目添加Spring Security框架 掌握Security框架配置 应用Security ...
- springBoot整合spring security实现权限管理(单体应用版)--筑基初期
写在前面 在前面的学习当中,我们对spring security有了一个小小的认识,接下来我们整合目前的主流框架springBoot,实现权限的管理. 在这之前,假定你已经了解了基于资源的权限管理模型 ...
- Spring boot Security 用于权限管理,用户添加等。
1:添加依赖: <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thy ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- 话说Spring Security权限管理(源码)
最近项目需要用到Spring Security的权限控制,故花了点时间简单的去看了一下其权限控制相关的源码(版本为4.2). AccessDecisionManager spring security ...
- 基于Spring Security 的JSaaS应用的权限管理
1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...
- spring boot:spring security用mysql实现动态权限管理(spring boot 2.3.3)
一,动态权限管理的优点和缺点 1,优点: 因为控制权限的数据保存在了mysql或其他存储系统中, 可以动态修改权限控制,无需改动代码和重启应用, 权限变更时灵活方便 2,缺点: 权限的设置需要保存在 ...
- spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
随机推荐
- Java实现 LeetCode 699 掉落的方块(线段树?)
699. 掉落的方块 在无限长的数轴(即 x 轴)上,我们根据给定的顺序放置对应的正方形方块. 第 i 个掉落的方块(positions[i] = (left, side_length))是正方形,其 ...
- Java实现 蓝桥杯 历届试题幸运数
问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所 ...
- 从windows到Mac的那些坑
今年入职一家新公司 公司办公统一使用Mac pro,所有国产软件不允许使用,只允许装国外的.开源的软件,,,,(这对一个从来没用过Mac的人来说,可真是头疼了一阵子) 经过几天的摸索,作一个简单的小总 ...
- c 到 c++
目录: 1.引用相关 2.const关键字 3.动态内存分配 1.引用相关: /* 概念:某个变量的引用等价于这个变量的别名 格式:类型名 & 引用名 = 某变量名 作用: 1. ...
- 计算从1到n中,出现某位数字的次数
出现1-9中某位数字次数的算法 /** * @param input 整数n(1 ≤ n ≤ 1,000,000,000) * @return 1-9中某个数字在数列中出现的次数 */ public ...
- 字符串相同ID竟然不同!!!
- RabbitMQ系列之【设置RabbitMQ远程ip登录】
由于账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆使用,并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq. ...
- Cypress系列(22)- 可操作类型的命令 之 select()
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html .select() 在 <sele ...
- CGAL代码阅读跳坑指南
CGAL代码阅读跳坑指南 整体框架介绍 CGAL中的算法和数据结构由它们使用的对象类型和操作参数化.它们可以处理满足特定语法和语义需求的任何具体模板参数.为了避免长参数列表,参数类型被收集到一个单独的 ...
- python数据预处理
缺失值处理 import pandas as pda import numpy as npy import matplotlib.pylab as pyl # data=pda.read_excel( ...