我有一个与密码相关的问题:
我们可以创建一个用户并通过这样做为他分配密码:
CREATE USER Bobby IDENTIFIED BY 12345
然后我们也可以通过以下方式授予他权限:
GRANT ALL ON *.* TO Bobby@'localhost' IDENTIFIED BY 'password';
但是,当我们通过执行以下操作更改该用户的密码时:
SET PASSWORD FOR 'Bobby'@'localhost' = PASSWORD('newpassword');
我可以使用这个新密码登录,也可以对数据库进行任何类型的查询。那么,在更新密码时,我们实际上是在更新使用CREATE USER Bobby
创建的密码和使用GRANT
创建的密码吗?
问题的另一部分是......如果CREATE与GRANT使用的密码不同时使用的密码,则GRANT密码似乎优先。那么,为什么CREATE中的密码对于?
是有用的答案 0 :(得分:1)
这是发生的事情。
有了这个
CREATE USER 'Bobby' IDENTIFIED BY '12345';
创建了一个用户。他没有权利,只能连接并查看服务器的配置方式和某些状态变量。执行此操作时也会发生同样的情况:
GRANT USAGE ON *.* TO 'Bobby'@'localhost' IDENTIFIED BY '12345';
您之前甚至不需要CREATE USER
声明。如果用户不存在,GRANT
语句将创建用户
因为我们使用GRANT
语句指定了密码,所以密码也会更改。没有单独的密码或其他。
当您通过GRANT
声明或SET PASSWORD
更改密码时,您只能使用新密码登录。
虽然为每个查询检查权限,但密码不是!当您不断开连接时,尽管您使用旧密码连接,仍然可以执行您拥有该权限的所有查询。
编辑:我必须自行更正,不会检查每个查询的权限。只要他连接,用户就拥有他连接时的权利。当从用户撤消权限时,他必须重新连接才能真正失去权限。