Chapter 2 User Authentication, Authorization, and Security(8):创建映射到登录名的数据库用户
未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。
前一篇:http://blog.csdn.net/dba_huangzj/article/details/38895357
前言:
登录名用于授权并访问服务器资源,如果需要访问数据库,需要对数据库内部的用户进行映射。用户是数据库级别的安全主体,访问数据库资源是授予给用户,而不是登录名。
实现:
有两种方法可以实现创建数据库用户,第一种是在服务器级别的登录名的属性页,另外一种是在数据库的【安全性】→【用户】节点中实现,这里使用第二种方式演示:
1.在SSMS中,选择【数据库】节点,并展开对应的数据库,选择【安全性】,右键【用户】选择【新建用户】
2. 在【常规】页,可以选择下面的用户类型:
类型简要说明:
| 用户类型 | 描述 |
| SQL user with login(带登录名的SQL用户) | 映射到一个SQL登录的用户。 |
| SQL user without login(不带登录名的SQL用户) | 没有映射到任何服务器级别的登录的用户,可以使用EXECUTE AS USER命令模拟执行。 |
|
User mapped to a certificate/User mapped to an asymmetric key (映射到证书/非对称密钥的用户) |
通过一个签名密钥创建的用户,允许映射自一个远程实体。 |
| Windows user (Windows用户) | 映射到Windows身份验证的登录名的用户。 |
3. 输入用户名,可以和登录名一样,或者使用其他允许的名字,但是不能使用一些关键字、保留字等。选择一个登录名(或者输入映射的证书、密钥)。然后选择默认架构,如果没有选择架构,SQL Server会使用dbo作为默认架构。除了图形化操作,还可以用下面的T-SQL实现:
USE marketing; CREATE USER [Fred] FOR LOGIN [Fred];
4. 如果想查询已创建的用户,可以用sys.database_pr\incipals目录视图实现:
SELECT dp.name as UserName, sp.name as LoginName, dp.default_language_name, dp.default_schema_name, dp.type_desc, dp.create_date
FROM sys.database_principals dp
JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type IN ('S', 'U')
AND dp.principal_id > 4;
其中1~4的principal_id为系统预设的用户。
原理:
你可以创建不带有登录名的用户,这种情况多数用在测试过程,或者仅用于安全上下文模拟(在第三章介绍)。要创建一个用户,需要在数据库层面上有ALTER ANY USER权限,等于固定数据库角色db_accessadmin,可以用GRANT ALTER ON USER::[用户名] to [特定需要用于管理的登录名]来实现。比如:
GRANT ALTER ON USER::[Fred] TO [Mary];
代表Mary这个登录名有权管理Fred这个用户。但是不给Mary过多的权限。
禁用用户:
和登录名的禁用不同,对于用户,没有ALTER USER XXXX DISABLE命令,在SSMS中也能看到没有这类勾选项。另外,一些系统用户,如guest、INFORMATION_SCHEMA,默认是禁用的。
如果要禁用用户,必须回收其CONNECT权限:
USE marketing; REVOKE CONNECT TO [Fred];
更多:
如果一个Windows 帐号属于某个Windows组,并且这个组作为一个登录被添加到SQL Server中,不仅可以创建一个数据库用户映射到整个组,也可以创建用户映射到单独的Windows帐号。比如,如果DOMAIN\Fred是DOMAIN\Developers组的成员,并且这个组已经定义为SQL Server登录名,但是DOMAIN\Fred登录未被添加,可以单独创建用户并授予权限:
CREATE USER [DOMAIN\Fred] FROM LOGIN [DOMAIN\Fred];
谁是dbo?
dbo代表Database Owner,是一个映射数据库拥有者的特殊数据库用户,当创建数据库时,所使用的登录名会被授予成owner,可以用下面语句查询:
SELECT SUSER_SNAME(owner_sid), name FROM sys.databases;
-- or :
SELECT SUSER_SNAME(sid)
FROM sys.database_principals
WHERE principal_id = USER_ID('dbo');
此时,登录名会自动映射到dbo中,并且授予整个库的所有权限,可以用下面语句修改:
ALTER AUTHORIZATION ON DATABASE::marketing TO sa;
把数据库marketing的owner更改给sa。这种做法在把数据库移动到别的服务器时,而拥有者的SID不存在,就很有用。
dbo用户不能被重命名或者删除,也不能从db_owner角色中移除,数据库拥有者和sysadmin服务器角色成员会被视为数据库的dbo用户,逻辑上,作为数据库拥有者会映射到dbo中,而sysadmin角色成员不需要映射,实际上,即使当sysadmin成员映射到一个数据库的用户是,它会被视为dbo。
什么是guest用户?
在每一个数据库中,你会看到一个用户名叫guest的用户,它是一个不能移除的数据库固定系统用户,目的是允许没有映射到一个用户的登录名能匿名访问数据库。但是默认是禁用的,以防不必要访问。从安全性角度来说,保持它的禁用是比较好的方法,如果想启用,可以授予CONNECT权限:
USE marketing; GRANT CONNECT TO guest;
可以使用下面代码检查guest用户是否启用:
SELECT CAST(IIF(dp.state IN ('G', 'W'), 1, 0) AS bit) AS [HasDBAccess]
FROM sys.database_principals u
LEFT JOIN sys.database_permissions dp
ON dp.grantee_principal_id = u.principal_id and dp.type = 'CO'
WHERE u.name = 'GUEST';
返回1即启用,-返回0为禁用。还可以用下面语句查看guest的权限:
SELECT permission_name, state_desc, OBJECT_NAME(major_id) as securable
FROM sys.database_permissions
WHERE grantee_principal_id = USER_ID('guest');
使用系统函数标识用户和登录
可以使用很多系统函数获取用户和登录的信息。
SYSTEM_USER和SUSER_SNAME(),返回当前登录信息,并包含SID。其中SUSER_SNAME()返回一个来自登录名或当前登录的SID,如果没有带有参数,在安全上下文更改时(EXECUTE AS ),会返回模拟登录。
CURRENT_USER和SESSION_USER返回当前数据库的当前上下文的用户名,USER_ID()或DATABASE_PRINCIPAL_ID()返回数据库的principal_id,而SUSER_SID()返回SID。
可以使用下面语句列出所有可以访问的数据库名:
SELECT [Name] FROM sys.databases WHERE HAS_DBACCESS ([Name]) = 1 AND database_id > 4 ORDER BY [Name];
如果需要查询某个用户是否属于Windows的组成员,可以使用IS_MEMBER()函数:
SELECT IS_MEMBER('DOMAIN\developers');
下面是可以使用的函数既描述:
| 函数名 | 描述 |
| SYSTEM_USER | 返回当前服务器登录名 |
| SUSER_SNAME() | 返回当前服务器登录名 |
| SUSER_ID() | 返回当前服务器SID |
| CURRENT_USER | 返回当前数据库用户 |
| SESSION_USER | 返回当前数据库用户 |
| USER_ID() | 返回当前数据库principal_id |
| DATABASE_PRINCIPAL_ID() | 返回当前数据库principal_id |
| ORIGINAL_LOGIN() | 返回在上下文切换钱的原始登录名 |
| HAS_DBACCESS('database') | 1代表当前登录可以访问数据库 |
| IS_MEMBER('group') | 1代表当前登录是Windows组成员 |
下一篇:http://blog.csdn.net/dba_huangzj/article/details/39003679
Chapter 2 User Authentication, Authorization, and Security(8):创建映射到登录名的数据库用户的更多相关文章
- Chapter 2 User Authentication, Authorization, and Security(11):在已还原的数据库中修正登录映射错误
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39496517,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(10):创建包含数据库
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39473895,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐户管理权限
原版的:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题文件夹:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(3):保server避免暴力袭击
原版的:http://blog.csdn.net/dba_huangzj/article/details/38756693,专题文件夹:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(7):创建和使用用户自定义服务器角色
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38895357,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(6):服务器权限授予粒度
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38867489,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(5):使用固定服务器角色
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38844999,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐号的管理权限
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题目录:http://blog.csdn.net/dba_huangzj ...
随机推荐
- 阿里云部署mongdb(CentOS)
配置包管理系统 (yum). Xshell登录Linux查看操作系统版本信息 lsb release -a 可以在官网选择对应的版本 :官网的安装指导文档http://docs.mongodb.org ...
- 【转】使用virtualenv在ubuntu上搭建python 3开发环境
ubuntu 13.04默认的python版本是2.7的,想在其上做python3的开发会遇到问题.比如要使用pip安装软件包时,默认安装的就是python2的包.如果想安装python3的包,就需要 ...
- C++笔记001:Microsoft Visual Studio 2010软件的安装与建立第一个cpp文件
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 我学习C++使用软件为Microsoft Visual Studio 2010. 首先,软件的安装包 链接:https://pan.bai ...
- 代理delegate
1>代理的用处是什么? 监听那些不能通过addTarget监听的事件 主要用开负责在两个对象之间,发生某些事件时,传递或发送消息 当我们需要 监听某些事件时,但苹果没有提供相关监听方法(addt ...
- Django的配置文件(settings)
静态文件设置: 一.概述: #静态文件交由Web服务器处理,Django本身不处理静态文件.简单的处理逻辑如下(以nginx为例): # URI请求-----> 按照Web服务器里面的配置规则先 ...
- Python 3.3.2 round函数并非"四舍五入"
对于一些貌似很简单常见的函数,最好还是去读一下Python文档,否则当你被某个BUG折磨得死去活来时,还不知根源所在.尤其是Python这种不断更新的语言.(python 2.7 的round和3.3 ...
- 安卓高级Fresco图片框架的时候
Fresco:2015FaceBook推出的 及其强大 支持webp图片格式 和渐进式图片加载 中文文档 使用方法 引入依赖 点击查看具体教程 基本使用步骤 在布局中使用其标签 <com.fac ...
- 【mybatis深度历险系列】mybatis的框架原理+入门程序解析
在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...
- 一个貌似比较吊的递归转换为loop--总算成功了.--第二弹
前段时间用类似于散弹式编程的方式,各种猜测-运行验证-修正结果,最终成功转换了一个看起来比较有难度的递归函数.但总觉得很蛋疼,原因如下: 1.虽然正确,但是逻辑搞得比较复杂.现在去看,一头雾水,不知道 ...
- 关于bootstrap在IE8下不能支持自适应的问题
说到这个问题,我就想吐槽下IE了,开发这么多版本,每个版本都有一些这样那样的问题不支持,别的正常的浏览器咋都能支持呢?真是垃圾浏览器!!!! 说归说,但是IE现在用的人多啊,怎么办?这个问题还是得解决 ...