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

Permissions (Database Engine)

Security 10:权限管理的更多相关文章

  1. 使用Spring Security实现权限管理

    使用Spring Security实现权限管理 1.技术目标 了解并创建Security框架所需数据表 为项目添加Spring Security框架 掌握Security框架配置 应用Security ...

  2. springBoot整合spring security实现权限管理(单体应用版)--筑基初期

    写在前面 在前面的学习当中,我们对spring security有了一个小小的认识,接下来我们整合目前的主流框架springBoot,实现权限的管理. 在这之前,假定你已经了解了基于资源的权限管理模型 ...

  3. Spring boot Security 用于权限管理,用户添加等。

    1:添加依赖: <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thy ...

  4. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  5. 话说Spring Security权限管理(源码)

    最近项目需要用到Spring Security的权限控制,故花了点时间简单的去看了一下其权限控制相关的源码(版本为4.2). AccessDecisionManager spring security ...

  6. 基于Spring Security 的JSaaS应用的权限管理

    1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...

  7. spring boot:spring security用mysql实现动态权限管理(spring boot 2.3.3)

    一,动态权限管理的优点和缺点 1,优点: 因为控制权限的数据保存在了mysql或其他存储系统中, 可以动态修改权限控制,无需改动代码和重启应用,  权限变更时灵活方便 2,缺点: 权限的设置需要保存在 ...

  8. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

    一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

随机推荐

  1. Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)

    787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是 ...

  2. Java实现蓝桥杯 算法提高 身份证号码升级

    算法提高 身份证号码升级 时间限制:1.0s 内存限制:256.0MB 问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位 ...

  3. Java实现 谁不爱打牌

    谁不爱打牌 [问题描述] BobLee最近在复习考研,但是他也喜欢打牌(有谁不爱玩牌呢?).但是作为一名ACMER,斗地主显然满足不了他的兴趣, 于是他和YYD一起YY出来了一个游戏规则,规则如下. ...

  4. java实现 洛谷 P1425 小鱼的游泳时间

    题目描述 伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的. 这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自 ...

  5. java实现正六面体染色

    ** 正六面体染色** 正六面体用4种颜色染色. 共有多少种不同的染色样式? 要考虑六面体可以任意旋转.翻转. 参考答案: 240 Burnside引理,正方体涂色问题 (n^6 + 3*n^4 + ...

  6. PAT 说反话

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...

  7. 【CSS】电脑、移动端公用样式

    电脑端: /* Public */ @charset "utf-8"; html, body, div, p, ul, ol, li, dl, dt, dd, h1, h2, h3 ...

  8. Spark Streaming,Flink,Storm,Kafka Streams,Samza:如何选择流处理框架

    根据最新的统计显示,仅在过去的两年中,当今世界上90%的数据都是在新产生的,每天创建2.5万亿字节的数据,并且随着新设备,传感器和技术的出现,数据增长速度可能会进一步加快. 从技术上讲,这意味着我们的 ...

  9. javascript 面向对象学习(一)——构造函数

    最近在学习设计模式,找了很多资料也没有看懂,看到怀疑智商,怀疑人生,思来想去还是把锅甩到基础不够扎实上.虽然原型继承.闭包.构造函数也都有学习过,但理解得不够透彻,影响到后续提高.这次重新开始学习,一 ...

  10. SSM框架处理跨域问题

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源.比如从www.baidu.com 页面去请求 www.google.com 的资源.跨域的严格一点的定义是:只要 协议,域名,端口有任何一个 ...