以非root用户身份连接到带有C#的MySQL数据库?

时间:2015-08-31 23:41:06

标签: c# mysql database windows windows-authentication

首先我要说的是我对数据库完全陌生,但一直在阅读他们的MySQL教程。

现在,我正在尝试创建一个允许非特权用户(非root用户)通过C#GUI应用程序连接并在数据库上执行某些命令的应用程序。用户将使用Windows身份验证登录数据库。

现在,我能够创建一个快速GUI,运行程序的人可以使用“root”连接到本地主机上的数据库,并获取其中的任何内容。

我的问题是,我如何允许用户使用非root权限进行连接?我能够找到的唯一的东西都是使用连接字符串w /“root”作为用户。

编辑:数据库已经制作完成。我个人无法以root用户身份连接到该用户并授予其他用户权限。

3 个答案:

答案 0 :(得分:4)

您可以使用grant语法,root向其他用户授予权限。 E.g:

GRANT ALL PRIVILEGES ON mydatabase.* TO pfinferno

答案 1 :(得分:2)

嗯,首先,你必须意识到这个" root" (来自MySQL)不同于" root"用户(来自您的计算机)。

当您登录MySQL数据库(首先是root用户)时,您可以创建具有最少权限的另一个用户。 (创建用户:https://dev.mysql.com/doc/refman/5.1/en/create-user.html

之后,您可以为此特定用户授予(授予)某些权限。 (授予权限:https://dev.mysql.com/doc/refman/5.1/en/grant.html) 例如,您可以允许某些用户仅从表中选择数据。另一个用户可以插入/更新。等等。

因此,在您的应用程序中,您可以指定另一个用户而不是root用户,正如您通常可以看到的那样。

答案 2 :(得分:2)

一些重要的概念也是这里显示的表中的行:

select user,host,password from mysql.user where user='pfinferno';

重要的一点是,用户可以拥有多个主机名或通配符。每个人都有自己的权利和密码。虽然上面的密码是经过哈希处理的,但至少你可以快速观察它,看看所有密码是否匹配(例如root用3个帐户)。

主机列由以下值填充,主要是:

标本A:

  • 本地主机
  • 127.0.0.1
  • 常见名称md21.newyork.comcastbusiness.net

%值是通配符。这是为了灵活性,但与用户一起使用时可能非常危险,例如' root'%'。强烈建议仅在标本A中保持根为第一个。此外,前两个在不同的工具中有很大不同。我建议的是前两个用户行,并保持密码相同。这种方法有利有弊。但请记住,当你无法连接其他东西时,依赖于连接,无论是代理,phpmyadmin,工具,my.conf设置等等。你将会重新审视这一点。

在Mureinik给出的示例中,它使用通配符host = %向用户授予权限。这意味着它依赖于这样创建的用户。请注意,通常以这种方式设置用户帐户。虽然没有什么可以限制你把它锁得更紧。

当用户尝试连接到服务器时,他最终连接的用户可以解析为不同的用户/主机组合,如在没有localhost(主机)用户或公共用户的情况下可以看到 - name,而是一个主机值为wildcard %的名称。这可以通过以下查询看出:

标本B:

select current_user(),user();

后者是连接尝试所呈现的用户,前者是已解决的用户,实际。这些影响可能导致人们在调试中浪费时间,这可以在这些论坛中看到。有些人几天都无法联系,我很认真。

标本C:

create user 'pfinferno'@'localhost' identified by 'thePassword';
create user 'pfinferno'@'127.0.0.1' identified by 'thePassword';
create user 'pfinferno' identified by 'thePassword';
create user 'pfinferno'@'md21.newyork.comcastbusiness.net' identified by 'thePassword';

- 注意上面的#3与' pfinferno' @'%'

相同

现在授予,主机名对于普通用户可以是通配符,主机名可以是localhost,仅为root用户可以是127.0.0.1。但是,在试图锁定安全性时,管理员通常会根据进入的主机名创建用户帐户(例如标本C,第4行),并根据这种情况使用授权来改变安全性。管理它可能有点压倒性。所以他们经常只是说搞砸它,我会创建通配符用户。 Susie说,对于新用户来说这可能没什么问题,但是对于Secimen C第4行,如果你是谁,那么你就可以获得第3行用户的资助,而你却不会接受。因此,解决用户的实际行为(参见标本B),从最具体的主机名到回退更为一般,直到找到一个如通配符。

不幸的是,用户不会使用本身指定的主机名连接,他们就是这样。他们试图连接。所以你不要说嘿我想成为这个东西@hostname,你就是这样。您是'pfinferno'@'md21.newyork.comcastbusiness.net',但可能会回退到通配符。

如果用户被放入标签C 之外的通配符%,那么您最好获得与他们一起使用的赠款,因为您现在是新用户。

尝试将grant语句中通配符的使用限制为不像惰性方法那样执行*.*,这只会授予所有数据库和表的权限。在Mureinik的例子中,它适用于一个数据库中的所有表。不是太寒酸。尝试微调权限,例如向表格授予SELECT权限或根本不授予对不需要它们的用户。在网上看到的WITH GRANT OPTION要小心,并从中剪切并粘贴。如果您使用它,则只授予用户授予其他用户权限的权限。

SSH隧道

您可能不想使用Secimen的一个原因主机= %通配符(明显我们是风险规避者除外)是

create user 'pfinferno'@'localhost' identified by 'thePassword';

非常适合SSH隧道。您将通过加密安全通道与PKI连接,并将您自己呈现为@ localhost。这大大减少了安全风险。

为什么我无法连接?

希望下面的视觉与小评论可以说明为什么我像我一样命名这个部分。

drop user 'pfinferno'@'localhost';
drop user 'pfinferno'@'127.0.0.1';
drop user 'pfinferno'@'%';
drop user 'pfinferno'@'md21.newyork.comcastbusiness.net';
flush privileges; -- some say this is not necessary, I have found otherwise

create user 'pfinferno'@'localhost' identified by 'thePassword';
create user 'pfinferno'@'127.0.0.1' identified by 'thePassword';
create user 'pfinferno' identified by 'thePassword';
create user 'pfinferno'@'md21.newyork.comcastbusiness.net' identified by 'thePassword';

...

select user,host,password from mysql.user where user='pfinferno';

grant all on so_gibberish.* to 'pfinferno'@'%'; -- grant all rights on so_gibberish db

flush privileges; -- some say this is not necessary, I have found otherwise

看一些补助金。

show grants for 'pfinferno'@'localhost';    -- sandboxed. Can just log in and sit there
+-----------------------------------------------------------------------------------------+
| Grants for pfinferno@localhost                                                          |
+-----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pfinferno'@'localhost' IDENTIFIED BY PASSWORD '*74692AE70C53...' |
+-----------------------------------------------------------------------------------------+

show grants for 'pfinferno'@'127.0.0.1';    -- sandboxed. Can just log in and sit there
same as above

show grants for 'pfinferno'; -- wildcard % user, has all rights on so_gibberish;
+-----------------------------------------------------------------------------------------+
| Grants for pfinferno@%                                                                  |
+-----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pfinferno'@'%' IDENTIFIED BY PASSWORD '*74692AE70C53...'         |
| GRANT ALL PRIVILEGES ON `so_gibberish`.* TO 'pfinferno'@'%'                             |
+-----------------------------------------------------------------------------------------+

请注意,GRANT USAGE表示至少您有权登录和坐(沙盒)。但是通配符%用户也完全拥有so_gibberish db的所有权利。

现在我通过mysql -u pfinferno -pthePassword

转到mysql提示符
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

mysql> select current_user(),user();
+---------------------+---------------------+
| current_user()      | user()              |
+---------------------+---------------------+
| pfinferno@localhost | pfinferno@localhost |
+---------------------+---------------------+

尝试的用户(user())已解析为相同的(current_user())。我被沙盒,基本上什么也没做,除了select now()无聊至死。

mysql> use so_gibberish;
ERROR 1044 (42000): Access denied for user 'pfinferno'@'localhost' to database 'so_gibberish'

以该用户退出mysql CLI。

现在

drop user 'pfinferno'@'localhost';
drop user 'pfinferno'@'127.0.0.1';
drop user 'pfinferno'@'md21.newyork.comcastbusiness.net';

我刚刚删除了我的pfinferno个用户中的三个

通过mysql -u pfinferno -pthePassword

转到mysql提示符
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| so_gibberish       |
+--------------------+

mysql> select current_user(),user();
+----------------+---------------------+
| current_user() | user()              |
+----------------+---------------------+
| pfinferno@%    | pfinferno@localhost |
+----------------+---------------------+

mysql> use so_gibberish;
Database changed

这显示@来自任何主机的CLI(或任何程序),首先尝试连接是由用户呈现,然后解析为实际(请参阅user()和{{1}的输出分别)。

所以,也许奇怪的是,当我删除用户时,current_user()随着用户被解析为另一个而增加。这可能是几小时/几天/几周调试的主题。用户可以不知道他们真正登录的是谁(已解决),或者为什么他们不能,因为每个人都可以拥有不同的密码!对于在mysql.user中有几行的用户EFFECTIVE RIGHTS尤其如此......并且考虑到最初可能有50%的mysql用户与它连接,最初是作为开发人员。只是一个猜测。