Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1200915
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 15:32:06

二、权限授予与回收

  中对于用户权限的授予和解除比较灵活,即可以通过专用命令,也可以通过直接操作字典表来实现,正所谓条条道路通目标。不过话说回来,修的马路多不叫奇迹,何况在这片神奇的土地,奇迹这个词本身就是奇迹,因此三思真是不好意思用奇迹这样的词来形容:这样想像不到的不平凡的事(注,该段描述为现代汉语词典中关于奇迹一词的解释),因此,我决定用一种加强的语气来描述我的感受:

  • 比奇迹更神奇的是,这条条大路居然都修成了高速路;
  • 比神奇的奇迹更神奇的是,这些高速居然都是免费的;
  • 比神奇的神奇奇迹更神奇,那就是神迹啊,额地神哪,免费的高速居然也不堵车,这肯定不是二环三环和四环,,至少也是十八环外了,弟兄们,走吧,跟着三思去溜达溜达~~~

    提示:

    基于合适的用户做符合其权限的事的目地,执行与权限相关操作的用户当然也得有权限,默认就是root了,该用户为安装MySQL数据库时自动创建,需要注意MySQL数据库的用户跟操作系统用户没有任何关系,也就是说此root非彼root,本例中所做的用户操作,均是使用mysql中的root用户执行。


2.1 创建用户

  MySQL中专用的创建用户命令是CREATE USER,该命令语法如下:

    CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']

        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...


  例如,先按照最简单的方式创建一个名为jss的用户:

    mysql> create user jss;

    Query OK, 0 rows affected (0.01 sec)


    mysql> select user,host,password from user where user='jss';

    +------+------+----------+

    | user | host | password |

    +------+------+----------+

    | jss  | %    |          |

    +------+------+----------+

    1 row in set (0.00 sec)

  这样创建的用户,可以从任意了mysql客户端,并能够访问目标的机器上创建连接,无须密码。

  例如,从ip:10.0.0.99的客户端执行连接:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss -h 172.16.1.110

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 126

    Server version: 5.1.49-community MySQL Community Server (GPL)


    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

    This software comes with ABSOLUTELY NO WARRANTY. This is free software,

    and you are welcome to modify and redistribute it under the GPL v2 license


    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


    mysql> select user();

    +---------------+

    | user()        |

    +---------------+

    | jss@10.0.0.99 |

    +---------------+

    1 row in set (0.00 sec)

  因为前面创建用户时指定的密码为空,因此连接时不必指定密码即可成功创建连接。


  如果希望用户连接时,必须指定密码,那就可以在创建用户时,通过指定identified by子句来设定密码,例如:

    mysql> create user jss_ps identified by 'jss';

    Query OK, 0 rows affected (0.00 sec)


    mysql> select user,host,password from user where user='jss_ps';

    +--------+------+-------------------------------------------+

    | user   | host | password                                  |

    +--------+------+-------------------------------------------+

    | jss_ps | %    | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    +--------+------+-------------------------------------------+

    1 row in set (0.00 sec)


    提示:

    Mysql中用户的密码是通过md5加密过的,如果希望在指定密码时,直接指定加密后的形式,可以通过identified by password ''子句,自行尝试吧。


  这样,当使用jss_ps用户登陆时,就必须指定密码,否则连接就会报错,例如:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss_ps -h 172.16.1.110

    ERROR 1045 (28000): Access denied for user 'jss_ps'@'10.0.0.99' (using password: NO)


  指定密码后再次连接:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss_ps -p -h 172.16.1.110

    Enter password: ***

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 131

    Server version: 5.1.49-community MySQL Community Server (GPL)


    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

    This software comes with ABSOLUTELY NO WARRANTY. This is free software,

    and you are welcome to modify and redistribute it under the GPL v2 license


    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


    mysql>


  如果希望指定的用户只能从某台指定的域(domain)或主机访问,可以在创建用户时指定host,例如,指定用户只能从10.0.0.99访问,执行命令如下:

    mysql> create user jss_ip@10.0.0.99 identified by password '*284578888014774CC4EF4C5C292F694CEDBB5457';

    Query OK, 0 rows affected (0.00 sec)


    mysql> select user,host,password from user where user like 'jss%';

    +--------+-----------+-------------------------------------------+

    | user   | host      | password                                  |

    +--------+-----------+-------------------------------------------+

    | jss    | %         |                                           |

    | jss_ps | %         | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    | jss_ip | 10.0.0.99 | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    +--------+-----------+-------------------------------------------+

    3 rows in set (0.00 sec)


  从任意非10.0.0.99的主机上执行连接会告知没有权限,例如:

    [root@rhel5u3 ~]# mysql -ujss_ip -p -h 172.16.1.110

    Enter password: 

    ERROR 1045 (28000): Access denied for user 'jss_ip'@'172.16.1.131' (using password: YES)


  综述:

  上面创建的三个用户:

  • jss:可以无须密码从任何主机使用jss用户访问;
  • jss_ps:从任何主机连接使用jss_ps的用户都可以访问数据库;
  • jss_ip:只有从10.0.0.99连接过来的用户才能访问数据库。


  CREATE USER只是创建用户的高速路之一,如果你觉着这条道路实在太过平坦,路边风景太过平淡,行程太过平常,不妨在抵达目的地之前,拐弯尝试一下grant 大道,饱览不一样的风景。

  Grant命令并非本小节重点,这里仅简要描述一下其语句中与用户相关的部分:

    GRANT priv_clause TO user [IDENTIFIED BY [PASSWORD] 'password']

            [, user [IDENTIFIED BY [PASSWORD] 'password']] ...

  看起来用户部分,跟create user是差不多的,事实上当然不是差不多,根本就是一模一样嘛,下面举个例子,操作如下:

    mysql> grant select on mysql.user to jss_grant@10.0.0.99 identified by 'jss';

    Query OK, 0 rows affected (0.00 sec)


    mysql> select user,host,password from user where user ='jss_grant';

    +-----------+-----------+-------------------------------------------+

    | user      | host      | password                                  |

    +-----------+-----------+-------------------------------------------+

    | jss_grant | 10.0.0.99 | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    +-----------+-----------+-------------------------------------------+

    1 row in set (0.00 sec)

  上述语句在实现了前面第3个例子(创建用户jss_ip)的功能外,还额外授予了jss_grant用户查询mysql.user表的权限。MySQL的开发团队靠着永不屈服、永不放弃、永不退缩、永不言败的奋争精神,用智慧和巧妙的构思完美复制了ORACLE GRANT语句的功能,这是全世界默默无闻的MySQL开发人员长期以来内生品格的自然流露,是全世界默默无闻的MySQL开发人员开拓前进的不竭动力,写到这儿三思忍不住不感叹,老美真是不会吹啊,这点儿破事儿要搁怕是早就吹成全宇宙史上的奇迹大书特吹了。


  如果说上述方式觉着都不顺手,或者,大脑短路导致短暂忘记了命令的语法,那也没关系,mysql.user表还记得吧,直接向该字典表中插入记录(一般insert语法想忘不容易),也是靠谱的,例如:

    mysql> insert into user (host,user,password) values ('%','jss_insert',password('jss'));

    Query OK, 1 row affected, 3 warnings (0.00 sec)


    mysql> select user,host,password from user where user = 'jss_insert';

    +------------+-----------+-------------------------------------------+

    | user       | host      | password                                  |

    +------------+-----------+-------------------------------------------+

    | jss_insert | %         | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    +------------+-----------+-------------------------------------------+

    1 rows in set (0.00 sec)

  看看,效果相同,不仅是看起来相同,实际表现也是一模一样,这点跟ORACLE数据库就截然不同了,ORACLE这类数据库是绝对不建议用户修改字典表的,而且一般情况下也不知道都应该改哪些地方(没错,完全可能不止一处需要修改),因此对于ORACLE数据库,最安全最稳妥也最快捷的方式还是老老实实按照ORACLE提供的命令进行操作,而MySQL则完全不同,官方不仅完全不介意用户通过操作字典表的方式进行功能修改(想想也是,连软件都是的,在这种地方设什么障碍也没有意义),甚至鼓励通过这种方式,话说回来,截止到MySQL5.1版本,都没有提供alter user的语法,因此如果想对用户做修改,update mysql.user表就算是比较便捷的方式了。


    提示:

    • 注意MySQL中用户名密码的大小写都是敏感的,也就是用户JSS和jss是两个不同的用户哟;
    • 用户名长度不超过16个字符;
    • MySQL数据库的用户跟操作系统用户没有任何关系,就算你在其中发现一个叫root甚至mysql的,那也说明不了什么;
    • password()是MySQL数据库提供的函数,专门用来做密码加密;
    • []的意思是可选,[,]的意思是可指定多个该参数。

=======================================

查看之前的连载:

MySQL数据库权限体系入门(1)---工作原理


阅读(1275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~