我的MySQL数据库需要两个用户:appuser和支持.
其中一位应用程序开发人员坚持要为这些用户创建四个帐户:
appuser@'%'
appuser@'localhost'
support@'%'
support@'localhost'
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法弄清楚为什么他认为我们需要这个.不会使用通配符作为主机来处理'localhost'吗?
有任何想法吗?
(在这里使用MySQL 5.5)
ale*_*oot 99
百分号表示所有ip,因此localhost是多余的...不需要localhost的第二条记录.
编辑
实际上,'localhost'在mysql中是特殊的,它意味着通过unix套接字(或我认为的Windows上的命名管道)的连接,而不是TCP/IP套接字.使用%作为主机不包含'localhost'
Joh*_*ary 31
正如@nos在当前接受的回答这个问题的评论中指出的那样,接受的答案是不正确的.
是的,当通过套接字连接而不是标准TCP/IP连接进行连接时,使用%和localhost用户帐户主机之间存在差异.
主机值%不包括localhost套接字,因此如果要使用该方法进行连接,则必须指定.
Dav*_*fer 11
让我们测试一下。
以超级用户身份连接,然后:
SHOW VARIABLES LIKE "%version%"; 
+-------------------------+------------------------------+ 
| Variable_name           | Value                        | 
+-------------------------+------------------------------+ 
| version                 | 10.0.23-MariaDB-0+deb8u1-log | 
Run Code Online (Sandbox Code Playgroud)
然后
USE mysql;
Run Code Online (Sandbox Code Playgroud)
设定
foo使用密码创建用户bar进行测试:
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
连接
要连接到Unix域套接字(即,由文件系统条目/var/run/mysqld/mysqld.sock或类似名称命名的I / O管道),请在命令行上运行此命令(使用该--protocol选项来双重确定)
mysql -pbar -ufoo
mysql -pbar -ufoo --protocol=SOCKET
Run Code Online (Sandbox Code Playgroud)
人们期望上面的匹配“用户来自本地主机”,但肯定不匹配“用户来自127.0.0.1”。
要从“ 127.0.0.1”连接到服务器,请在命令行上运行它
mysql -pbar -ufoo --bind-address=127.0.0.1 --protocol=TCP
Run Code Online (Sandbox Code Playgroud)
如果省略--protocol=TCP,该mysql命令仍将尝试使用Unix域套接字。您还可以说:
mysql -pbar -ufoo --bind-address=127.0.0.1 --host=127.0.0.1
Run Code Online (Sandbox Code Playgroud)
一行中的两次连接尝试:
export MYSQL_PWD=bar; \
mysql -ufoo --protocol=SOCKET --execute="SELECT 1"; \
mysql -ufoo --bind-address=127.0.0.1 --host=127.0.0.1 --execute="SELECT 1"
Run Code Online (Sandbox Code Playgroud)
(密码是在环境中设置的,以便将其传递给mysql进程)
怀疑时进行验证
真正检查连接是否通过TCP / IP套接字或Unix域套接字进行
ps fauxlsof -n -p<yourpid>。您将看到类似以下内容:
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
要么
mysql [PID] quux 3u unix [code] 0t0 [code] socket
Run Code Online (Sandbox Code Playgroud)
所以:
update user set host='10.10.10.10' where user='foo'; flush privileges;
Run Code Online (Sandbox Code Playgroud)
update user set host='%' where user='foo'; flush privileges;
Run Code Online (Sandbox Code Playgroud)
update user set host='localhost' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
行为各不相同,这显然取决于skip-name-resolve。如果设置,将导致localhost根据日志忽略行。在错误日志中可以看到以下内容:“在--skip-name-resolve模式下忽略了'user'条目'root @ localhost'。。这意味着没有通过Unix域套接字的连接。但这不是事实。localhost现在仅表示Unix域套接字,并且不再匹配127.0.0.1。
skip-name-resolve 已关闭:
skip-name-resolve 开启:
update user set host='127.0.0.1' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
update user set host='' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
(根据MySQL 5.7:6.2.4访问控制,第1阶段:连接验证,空字符串”也表示“任何主机”,但在'%'之后排序。)
(“ 192.168.0.1”是我机器的IP地址之一,请根据您的情况进行相应更改)
update user set host='192.168.0.1' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
但
mysql -pbar -ufoo -h192.168.0.1:确定(!)后者是因为这实际上是TCP连接来自192.168.0.1,如lsof:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
update user set host='0.0.0.0' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
update user set host='255.255.255.255' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
(127.0.0.2是完全有效的回送地址,等效于RFC6890中定义的127.0.0.1 )
update user set host='127.0.0.2' where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
有趣的是:
mysql -pbar -ufoo -h127.0.0.2从连接127.0.0.1并失败mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2 还可以delete from user where user='foo';flush privileges;
Run Code Online (Sandbox Code Playgroud)
要查看mysql.user权限表之一的表中实际包含的内容,请使用:
SELECT SUBSTR(password,1,6) as password, user, host,
Super_priv AS su,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs,
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic,
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin
FROM user ORDER BY user, host;
Run Code Online (Sandbox Code Playgroud)
这给出了:
+----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+
    | password | user     | host      | su | gr | selock | modif | ria | views | funcs | replic | admin  |
    +----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+
    | *E8D46   | foo      |           | N  | N  | NN     | NNNNN | NNN | NNN   | NNNNN | NN     | NNNNNN |
Run Code Online (Sandbox Code Playgroud)
对于表类似mysql.db:
SELECT host,db,user, 
       Grant_priv as gr,
       CONCAT(Select_priv, Lock_tables_priv) AS selock, 
       CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif, 
       CONCAT(References_priv, Index_priv, Alter_priv) AS ria, 
       CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views, 
       CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs 
       FROM db ORDER BY user, db, host;
Run Code Online (Sandbox Code Playgroud)
        百分比符号表示:任何主机,包括远程和本地连接。
本地主机只允许本地连接。
(所以首先,如果您不需要远程连接到您的数据库,您可以立即摆脱 appuser@'%' 用户)
所以,是的,它们是重叠的,但是......
...设置这两种类型的帐户是有原因的,这在 mysql 文档中进行了解释:http : //dev.mysql.com/doc/refman/5.7/en/adding-users.html。
如果您的本地主机上有一个匿名用户,您可以通过以下方式发现:
select Host from mysql.user where User='' and Host='localhost';
Run Code Online (Sandbox Code Playgroud)
如果您只是创建用户 appuser@'%'(而不是 appuser@'localhost'),那么当 appuser mysql 用户从本地主机连接时,将使用匿名用户帐户(它优先于您的 appuser@ '%' 用户)。
对此的解决方法是(正如人们所猜测的)创建 appuser@'localhost' (它更具体,本地主机匿名用户,如果您的 appuser 从本地主机连接,将使用)。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           82260 次  |  
        
|   最近记录:  |