在SQL Server数据库中主要是通过角色来继承相关的权限但是这个权限继承很容易造成权限上的沖突如现在有个销售员账户SALE有一个销售部门角色DE_SALES其中销售部门角色DE_SALES具有查询所有客户信息即CUSTOM表的权限但是销售员账户SALE其由于是为试用期的员工设置的临时帐户所以其不能够查询CUSTOM表但是SALE帐户其是属于销售部门这个角色其会继承销售部门这个角色的所有访问权限此时SALE帐户所属角色的权限跟自己帐户的权限就产生了沖突遇到这种情况SQL Server数据库该如何处理呢?
在SQLServer数据库中授予组或者角色的权限由该组或者角色的成员所继承虽然某个用户可能在一个级别上授予或者废除权限但如果这些权限与更高级的权限发生沖突的话则可能会打破数据库管理员的权限设计思路让某个用户意外的禁止或者允许访问某个数据库对象为了避免因为数据库权限沖突所导致的一系列问题SQLServer数据库提出了一些解决措施虽然通过这些措施不能够完全避免权限之间的沖突但是至少让数据库管理员看到了解决问题的希望
招数一明确拒绝
应用场景现在数据库中有用户Landy其属于销售员SALES角色其中销售员角色具有查询客户信息表Customs的权限而由于某种原因数据库管理员限制用户Landy访问数据库对象Customs表的权利此时就会有对象访问权限上的沖突此时数据库管理员该如何才能够避免这种沖突呢?
第一个招数就是学会使用拒绝操作在数据库中拒绝权限始终优先在任何级别(无论是用户或者角色)上的拒绝权限都拒绝该对象上的权限无论该用户现有的权限是否已授予权限还是被废除权限这听起来比较绕口或许根据上面的例子来讲大家更容易明白如上例若要解决上面的权限沖突问题则我们只需要在用户Landy的权限设置中拒绝其具有数据库对象表Customs表的Select权限由于显示的拒绝其总被优先执行所以即使其所属的角色具有表Customs的访问权限但是其成员Landy由于被显示的拒绝根据拒绝优先的选择则其最终不会有数据库表Customs的访问权限
所以笔者所传授给大家的第一个招数就是要学会使用拒绝操作各位数据库管理员要牢记在权限管理中拒绝操作总是被优先执行另外还有一个极端的例子可以说明这个问题如果数据库管理员把Public进行设置设置为拒绝权限此时由于拒绝权限被优先执行则数据会禁止任何用户访问能数据库对象故拒绝权限一般往往用在用户级别上可以实现对个别特殊用户的权限控制而不用给他们设置独立的组这让数据库权限管理更加的灵活
招数二废除权限可以让某些帐户恢复正常
应用情景现在数据库中有用户Landy其属于销售员SALES角色其中销售员角色具有查询客户信息表Customs的权限而由于某种原因数据库管理员限制用户Landy访问数据库对象Customs表的权利此时数据库管理员给Landy用户显示的拒绝访问Customs表的权利但是现在这个限制其访问客户表的原因已经消除用户Landy 可以正常访问表Customs了此时该如何处理呢?
此时数据库管理员可以通过废除权限操作来完成需求废除权限只删除所废除级别(如用户角色或者组)上的已授予权限或者已拒绝权限而在另外级别上所授予或者拒绝的同一权限仍然适用废除权限类似于拒绝权限因为二者都是在同一级别上删除已经授予的权限但是废除权限是删除已经授予的权限并不妨碍用户组或者角色从更高级别继承已授予的权限为此如果废除用户查看表的权限并不一定能够防止用户查看该表这跟拒绝权限操作就有本质的区别
举例来说在上面这个例子中Landy用户刚开始其被显示的拒绝访问表Customs虽然其所属的角色具有访问表Customs的权限但是因为拒绝优先所以用户Landy最终不能过访问这个表此时若限制原因消除则数据库管理员可以采取废除权限操作把Landy用户上的拒绝权限废除掉因为废除权限只删除用户Landy上已拒绝访问这个表的权限而不影响从角色SALES中继承统一权限为此用户Landy最终具有访问这个表Customs的权限这就是废除权限操作的本质
在实际工作中废除权限操作与拒绝权限操作往往被用来处理一些特殊的帐户如不少企业中试用期员工其权限往往会受到限制出于安全起见企业不会让一些还在试用期的员工访问所有的数据为此就要对他们的权限进行限制此时就可以在这些用户帐户级别上显示的拒绝实现部分访问限制的需求当他们试用期过后若试用合格的话就可以把这些帐户的拒绝权限废除掉如此的话他们就可以正常继承他们所属角色或者组的权限可见拒绝权限与废除权限结合可以让数据库全县的管理更加的统一最终要的是可以最大程度的避免因为权限沖突而导致的数据管理上的安全漏洞
另外在实际配置中需要注意一个问题虽然废除权限具有废除拒绝权限的能力但是他只能够在一个级别上其作用如上面这个例子中另外还有一个T_SALES的角色其权限设置中显示的拒绝访问表Customs此时若用户Landy同时属于SALES角色和T_SALES角色虽然通过废除权限废除了用户Landy级别上的拒绝访问表Customs的权限但是用户Landy所属的T_SALES角色中的拒绝权限仍然具有优先执行的权力所以最终这个用户仍然不能够访问表Customs所以通过废除对权限的拒绝可以删除已经拒绝的权限但是如果用户在其他组或者角色级别有其他拒绝权限的话在该用户访问某个对象的权限仍然会被拒绝
招数三授权操作让用户访问权限一目了然
应用情景现在数据库中有用户Landy其属于销售员SALES角色其中销售员角色具有查询客户信息表Customs的权限而由于某种原因数据库管理员限制用户Landy访问数据库对象Customs表的权利此时数据库管理员给Landy用户显示的拒绝访问Customs表的权利但是现在这个限制其访问客户表的原因已经消除用户Landy 可以正常访问表Customs了此时该如何处理呢?
此时除了可以通过上面的废除权限操作来处理还可以通过授权操作来完成废除权限操作有一个缺陷就是数据库管理员要判断这个用户到底是否具有某个数据库对象的访问权限时还需要去查看其所属的角色或者组中的权限设置这会增加一定的工作量而授权操作则可以避免这种情况授予权限删除所授予级别伤的已经拒绝权限或者已经废除权限而在另一级别上所拒绝权限的同一权限仍然适用但是虽然在另一级别上所废除的同一权限仍然适用但他不阻止用户访问该对象也就是说如果Sales角色可以访问表Customs现在数据库管理员授予了用户Landy访问Customs表的权限则用户最终具有访问表Customs的权限但是如果Sales角色显示的拒绝了表Customs的查询权限此时即使显示的授予用户Landy表Customs的访问权限则该用户仍然不能够访问表Customs因为拒绝权限总是被优先执行所以说用户最终得到的是对象上所授予拒绝或者废除权限的全部权限的并集其中拒绝权限具有最优先的权利
通过拒绝废除授权等权限操作可以减少因为权限继承所导致的权限沖突最后笔者建议在高级别的权限设置上如组或者角色上最好不要轻易使用拒绝权限拒绝权限因为具有最优先的执行权力所以一般在用户级别上采用即可若在组或者角色上采用拒绝权限则在用户上所采取的废除权限或者授予权限操作都将不能够其作用为此为了提高权限管理的灵活性笔者认为拒绝权限在用户级别上实施比较合理可以提高权限管理的灵活性