zoukankan      html  css  js  c++  java
  • Security2:角色和权限

    权限的授予分为三部分:权限(Permission),安全对象(Securable)和安全主体(Principal),这三个术语之间的关系是:Grant Permission on Securable to Principal,通俗地解释是:授予Principal操作Securable的Permission。Principal是被授予权限的实体,Securable是table,view等对象,是Principal操作的对象;有时Principal也会作为Securable,被其他Principal操纵。

    一,Role 作为 Principal,被授予权限

    查看Permission列表,点击:Permissions (Database Engine),这里列出的是单个权限(Individual permission),role 是权限的集合。

    1, 创建角色

    Role分为数据库角色和服务器角色,AUTHORIZATION owner_name 子句用于指定角色Owner

    CREATE ROLE role_name 
    AUTHORIZATION owner_name
    
    CREATE SERVER ROLE role_name 
    AUTHORIZATION server_principal

    角色的所有者,在删除所有者之前,必须修改角色的所有者关系,经常把角色的所有者设置为dbo:

    ALTER AUTHORIZATION 
    ON ROLE::[role_name] TO [dbo]

    如果数据库用户拥有一个role,在删除用户时,数据库将抛出错误:

    The database principal owns a database role and cannot be dropped.

    2,将权限授予角色,角色是权限的集合

    Role作为一个Principal,可以使用Grant子句为role授予权限,这里为role授予Object的Permissions

    GRANT <permission> [ ,...n ] 
    ON [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
    TO <database_principal> [ ,...n ] 
    [ WITH GRANT OPTION ]
    
    <database_principal> ::= Database_user | Database_role

    3,为角色增加或删除一个用户成员

    ALTER [Server] ROLE role_name
    {
          [ ADD MEMBER database_principal ]
        | [ DROP MEMBER database_principal ]
    }

    4,示例,授予数据库角色访问table的权限

    grant ALTER,DELETE,INSERT,SELECT,UPDATE  --Permission List
    on dbo.dt_test    --Table Name
    to dabase_level_role    --Role Name
    with GRANT OPTION 

    二,Role 作为Securable,Principal授予操纵Role的权限

    Role 可以是数据库的安全主体(Principal),被授予权限;Role可以是数据库的安全对象(Securable),Grant子句可以授予Principal操纵Role的权限。

    GRANT permission [ ,...n ]  
        ON 
        {  [ USER :: database_user ]
          | [ ROLE :: database_role ]
        }
        TO <database_principal> [ ,...n ]
        [ WITH GRANT OPTION ]
    
    <database_principal> ::= Database_user | Database_role 

    1,Granting CONTROL permission on a user to another user

    GRANT CONTROL 
    ON USER::Wanida 
    TO RolandX;

    2,Granting VIEW DEFINITION permission on a role to a user with GRANT OPTION

    GRANT VIEW DEFINITION 
    ON ROLE::SammamishParking 
        TO JinghaoLiu  
    WITH GRANT OPTION;

    三,数据库对象权限

    对数据库对象的权限控制,粒度是表列,数据行是对象的所有数据行。

    GRANT <permission> [ ,...n ] ON 
        [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
        TO <database_principal> [ ,...n ] 
        [ WITH GRANT OPTION ]
        [ AS <database_principal> ]
    
    <database_principal> ::= Database_user | Database_role 

    对象的权限列表:

    • Scalar function permissions: EXECUTE, REFERENCES.
    • Table-valued function permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.
    • Stored procedure permissions: EXECUTE.
    • Table permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.
    • View permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.

    1,Granting SELECT permission on a table

    GRANT SELECT ON OBJECT::Person.Address TO RosaQdM;

    2,Granting EXECUTE permission on a stored procedure

    GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
        TO Recruiting11;

    四,使用固定数据库角色授权,授予某个User只读数据的权限

    Step1,在SQL Server中为该用户创建一个Login和User,在创建User时,建立Login 和 User 之间的Mapping 关系。

    由于权限是授予user的,所以必须使用Use 子句切换到当前db中

    --create Login Name
    create login [domainlogin]        
    from windows;
    
    use current_db_name
    go
    --create --UserName
    Create User DWReadOnly            
    for login [domainlogin]

    Step2,使用DB的Fixed Role

    db_datareader :Members of the db_datareader fixed database role can read all data from all user tables.

    只需要将User 添加到DB的 db_datareader 中,那么这个User 就能 只能 read 所有的User table,而不会修改任何数据。

    step3,使用Alter Role 授予user 只读权限

    --Grant readonly
    ALTER ROLE [db_datareader] 
    add MEMBER DWReadOnly

    如果要授予Server Role(服务器角色)权限,授予权限的Principal 是Login。

    create login [domainusername]
    from windows;
    
    alter server role sysadmin
    add member [domainusername];

    五,固定角色

    固定角色分为服务器级别和数据库级别,角色的权限是预先定义好的,除了public角色之外,不能修改角色的权限。

    1,数据库级别的固定角色

    在数据库级别最高的权限是db_owner角色,拥有数据库的最高权限:control database

    • db_owner:允许在数据库中执行任何操作,包括删除数据库
    • db_ddladmin:允许执行DDL命令
    • db_datawriter:允许对所有表进行增删改查操作
    • db_datareader:允许对所有表进行查找操作
    • db_denydatawriter:不允许对表执行insert、update和delete命令
    • db_denydatareader:不允许对表执行select命令
    • public:数据库级别的public角色,权限可以被修改,所有的用户都会继承public角色的权限

    2,服务器级别的固定角色

    在服务器级别,最高的权限是sysadmin,能够在服务器中执行任何操作。

    public 角色,权限可以被修改,所有的login都会继承public角色的权限

    3,特殊的public角色

    public角色分为:数据库级别和服务器级别

    • 对于数据库级别的public角色,任何数据库的用户(User)都属于public角色
    • 对于服务器级别的public角色,任何服务器的登录(Login)都属于public角色

    虽然public角色属于固定(服务器级别和固定数据库级别)的角色,但是其特殊之处在于:角色的权限可以被修改。

    每个 SQL Server 的登录(Login)均属于 public 服务器角色,所有的数据库用户(User) 都属于public数据库角色。用户不能删除public角色,但是,可以授予或收回public角色的权限。默认情况下,public角色被分配很多权限,大部分权限都跟数据库中的日常操作有关。默认情况下,

    • 数据库级别的public 角色拥有的权限:查看特定系统表
    • 服务器级别的public 角色拥有的权限:查看数据库,链接服务器(VIEW ANY DATABASE, CONNECT)

    当一个对象对所有用户或登录可用时,只需把权限分配给 public 角色即可。默认情况下,所有的数据库用户都属于public角色,因此,授予或回收public角色的权限,将会影响所有的用户。

    参考文档:

    GRANT Object Permissions (Transact-SQL)

    GRANT Database Principal Permissions (Transact-SQL)

    GRANT Database Permissions (Transact-SQL) 

    Database-Level Roles

    Server-Level Roles

  • 相关阅读:
    vc 网络编程(socket)
    《精通Windows API-函数、接口、编程实例》——第4章文件系统
    WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
    Windows编程 鼠标
    Windows 编程 键盘
    Windows编程 Windows程序的生与死(下)
    二叉查找树——A1043.Is it a Binary Search Tree(25)
    Springboot + ElasticSearch 构建博客检索系统
    树的遍历——A1053.Path of Equal Weight(30) 只可DFS不可BFS
    树的遍历——A1004.Counting Leaves(30) 给出一棵树,问每一层有多少叶子节点(可DFS也可BFS)
  • 原文地址:https://www.cnblogs.com/ljhdo/p/5176024.html
Copyright © 2011-2022 走看看