首先我要说的是我对数据库完全陌生,但一直在阅读他们的MySQL教程。
现在,我正在尝试创建一个允许非特权用户(非root用户)通过C#GUI应用程序连接并在数据库上执行某些命令的应用程序。用户将使用Windows身份验证登录数据库。
现在,我能够创建一个快速GUI,运行程序的人可以使用“root”连接到本地主机上的数据库,并获取其中的任何内容。
我的问题是,我如何允许用户使用非root权限进行连接?我能够找到的唯一的东西都是使用连接字符串w /“root”作为用户。
编辑:数据库已经制作完成。我个人无法以root用户身份连接到该用户并授予其他用户权限。
答案 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个帐户)。
主机列由以下值填充,主要是:
md21.newyork.comcastbusiness.net
等 %
值是通配符。这是为了灵活性,但与用户一起使用时可能非常危险,例如' root'%'。强烈建议仅在标本A中保持根为第一个。此外,前两个在不同的工具中有很大不同。我建议的是前两个用户行,并保持密码相同。这种方法有利有弊。但请记住,当你无法连接其他东西时,依赖于连接,无论是代理,phpmyadmin,工具,my.conf设置等等。你将会重新审视这一点。
在Mureinik给出的示例中,它使用通配符host = %
向用户授予权限。这意味着它依赖于这样创建的用户。请注意,通常以这种方式设置用户帐户。虽然没有什么可以限制你把它锁得更紧。
当用户尝试连接到服务器时,他最终连接的用户可以解析为不同的用户/主机组合,如在没有localhost(主机)用户或公共用户的情况下可以看到 - name,而是一个主机值为wildcard %
的名称。这可以通过以下查询看出:
select current_user(),user();
后者是连接尝试所呈现的用户,前者是已解决的用户,实际。这些影响可能导致人们在调试中浪费时间,这可以在这些论坛中看到。有些人几天都无法联系,我很认真。
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
要小心,并从中剪切并粘贴。如果您使用它,则只授予用户授予其他用户权限的权限。
您可能不想使用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> 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> 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用户与它连接,最初是作为开发人员。只是一个猜测。