mysql用户权限设置

转载请说明出处:博客园--邦邦酱好 http://www.cnblogs.com/bangbangjiang/p/3566388.html

 

通常我们会使用sqlyog等图形化管理MYSQL数据库的工具来管理mysql上的数据。当很多人同时通过sqlyog来访问数据库时,我们就需要创建不同的用户账户来分配不同的权限。

比如在某些游戏测试中,策划需要对配置库拥有修改的权限,对玩家数据库只能拥有查询的权限;测试人员对配置库只能有查询的权限,对玩家数据库拥有修改的权限;开发对配置库和玩家数据库都要有查询,修改的权限。当然了,这些权限需要看整个游戏的架构是怎么处理的再来决定权限。

那么我们先来学学用户账号设置的一些问题。

一.创建账户

(注意:创建前需要先进入mysql数据库中,"use mysql")

语法是这样的:GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password WITH GRANT OPTION;

1.privileges:授予用户的权限。它包括下面几项(更多的权限可以查看mysql数据库下的user表的列):

      Alter (修改表和索引 )

  Create(创建数据库和表 )
  Delete (删除表中已有的记录 )
  Drop (抛弃(删除)数据库和表 )
  INDEX (创建或抛弃索引 )
  Insert ( 向表中插入新行 )
  REFERENCE (未用 )
  Select (检索表中的记录 )
  Update ( 修改现存表记录 )
  FILE (读或写服务器上的文件 )
  PROCESS ( 查看服务器中执行的线程信息或杀死线程 )
  RELOAD (重载授权表或清空日志、主机缓存或表缓存。)
  SHUTDOWN(关闭服务器 )
  ALL (所有;ALL PRIVILEGES同义词 )
  USAGE (特殊的“无权限”权限)

2.columns:权限运用的列,它是可选的,并且你只能设置列特定的权限。如果命令有多于一个列,应该用逗号分开它们;

3.databases_name:权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。

4.user_name:权限授予的用户,它由一个用户名和主机名组成(如test@localhost,mm@192.168.0.122)。在MySQL中,你不仅指定谁能连接,还有从哪里连接。这允许你让两个同名用户从不同地方连接。 MySQL让你区分他们,并彼此独立地赋予权限。MySQL中的一个用户名就是你连接服务器时指定的用户名,该名字不必与你的Unix登录名或 Windows名联系起来。缺省地,如果你不明确指定一个名字,客户程序将使用你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接执行需要超级用户权限的操作。

5.password:赋予用户的口令,它是可选的。如果你对新用户没有指定IDENTIFIED BY子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用IDENTIFIED BY时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要你用SET PASSWORD 那样使用password()函数。

6.WITH GRANT OPTION:这是可选的,写上它就是允许你所创建的这个用户把他拥有的那些权限授给其他的用户。可以用于数据库、表和保存的程序

 

下面来创建一个名为tester,密码为123,并且只能对peizhi库进行查询操作的账户:

    mysql> grant select on peizhi.* to tester@localhost identified by "123" with grant option;

这样你就可以使用账号tester,密码123来登陆peizhi库了:

(登陆之后你会发现tester用户只能看到peizhi这个数据库,其他库是看不到的,root用户却可以看到全部的数据库。)

 

如果tester用户试图修改peizhi库里的数据,sqlyog就会提示:

它告诉你,你没有权限修改表。

  具体需要授予什么权限就要根据实际情况判断了。

 

当我们grant之后,打开mysql库下的user表就会发现多了一行记录:

 

二.删除

  (1)取消一个用户的权限,可以使用revoke语句:REVOKE privileges(columns) ON databases_name.tables FROM user_name@host;

可以仅取消部分权限,它只删除权限,不删除用户,只要在user表中有这个用户的记录,即使权限都没了,这个用户仍然可以连接服务器。

  (2)删除一个用户:手动地修改(使用INSERTUPDATEDELETE等等)授权表(user表),如:delete from user where user="tester";删除了tester这个账户,你应该执行 flush privileges(也有可能是mysqladmin flush-privilegesmysqladmin reload告诉服务器再装载授权表,否则你的更改将不会生效,除非你重启服务器。

  更改无效的意思是:tester这个用户还是能够使用sqlyog登陆数据库进行操作,只有flush之后,这个用户才会真正失效,无法访问数据库。

 

三.讨论几个问题

1.访问控制:谁能连接,从哪里连接

  当你试图连接MySQL服务器时,服务器基于你的身份以及你是否能通过供应正确的密码验证身份来接受或拒绝连接。如果不是,服务器完全拒绝你的访问身份基于2个信息:(1)你从哪个主机进行连接,对应于user表的host字段;(2)你的mysql用户名,对应于user表的name字段

  它们是这句“GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password;”;里的“user_name@host”

  身份检查使用3个user表(Host, User和Password)范围列执行,服务器只有在user表记录的Host和User列匹配客户端主机名和用户名并且提供了正确的密码时才接受连接。
host可以有很多种描述:

  (1)允许任何主机以max的用户名进行连接:%(通配符),比如:max@% (它等价于max)。这是最简单的建立用户方式,但是也是最不安全的。

  (2)允许一个受限的主机集合以max的用户名进行连接,比如:max@%.snake.net,从snake.net域的任何主机。

  (3)允许某个IP地址的用户以max的用户名进行连接,比如:

    max@192.168.128.5(特定主机),

    max@192.168.128.%(C类子网),

    max@192.168.128.0/15(15位网络号并匹配具有192.168.128头的IP地址)

 

2.权限控制

  (1)对用户:WITH GRANT OPTION子句允许你把访问授权的权利授予另一个用户。要注意,拥有GRANT权限的两个用户可以彼此授权。如果你只给予了第一个用户Select权 限,而另一个用户有GRANT加上Select权限,那么第二个用户可以是第一个用户更“强大”。
  (2)对数据库:

    全局权限是最强大的,因为它们适用于任何数据库。

    “GRANT privileges(columns) ON databases_name.tables TO user_name@host IDENTIFIED BY password;“里的databases_name设为:*.*即可。

    仅对某个库:databases_name.tables设为:database_name.*

    仅对某个表的某个列:GRANT Select ON peizhi.member TO tester@localhost INDETIFIED BY "123";

                            GRANT Update (id,name) ON peizhi.member TO tester@localhost;

 

更多的资料可以参阅mysql的使用手册:访问权限系统。

 

 

 

 

posted @ 2014-02-26 13:30  邦邦酱好  阅读(3930)  评论(0编辑  收藏  举报