LAMP网站开发黄金组合Linux+Apache+MySQL+PHP
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.1 账户管理

用户拥有一个登录账号是使用MySQL的基础,本节就将介绍如何设置MySQL用户账号及其权限。

6.1.1 创建新账号

首先来看如何新建一个MySQL用户账号,以及授予其权限。MySQL可以使用GRANT命令语句来完成这一功能:

    GRANT privileges [(columns)]
    ON what
    TO user IDENTIFIED BY "password"
    WITH GRANT OPTION

参数说明:

● privileges:分配给用户的权限。表6-1列出了可在GRANT语句中使用的权限,及其代表的意义:

表6-1 GRANT命令可授予的用户权限列表

● columns:所授予权限所适用的列,可选,用来设置列级专有权限。如果多于一个列,则可用逗号将其分开。

● what:所授予权限的应用范围,包括全局的(“*.*”,适用于所有数据库和所有的表)、数据库专有的(“db_name.*”,适用于某个数据库中的所有表),以及表(“db_name.table_name”,适用于某个表)专有的。如果想更进一步指定权限适用的列,可以通过COLUMNS子句指定。

● user:授予权限的用户,由用户名和主机名组成,如user_name@host_name。即不单指定谁进行连接,还要指定从网络的哪个位置进行连接,MySQL支持多个同名、从不同位置连接的用户。

● password:用户口令,可选。如果不给新用户指定IDENTIFIED BY子句,该用户不分配口令。对于已有的用户,指定的口令将替代旧口令;如果不指定新口令,用户的旧口令仍然保持不变。当使用IDENTIFIED BY时,GRANT会自动对口令进行加密。

● WITH GRANT OPTION:可选。如果包含该子句,该用户可以将自身的权限授予其他用户。

例如下面的命令将建立一个新的用户newuser1@localhost,并授予其在数据库student_course上所有操作权。

    GRANT ALL ON student_course TO newuser1@localhost IDENTIFIED BY "password"

下面的命令授予newuser2@localhost在表student_course.students上的修改和删除权。

    GRANT UPDATE DELETE ON student_course.students TO newuser2@localhost IDENTIFIED BY
"password"

此时,如果使用newuser2登录,则只能看到student_course中的students表,如果试图查询表中的数据,则会报错:

    %mysql -u newuser2 -p
    Enter password: ********
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8 to server version: 4.0.14-max-debug
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql> use student_course;
    Database changed
    mysql> show tables;
    +----------------------------------------+
    | Tables_in_student_course     |
    +----------------------------------------+
    | students                 |
    +----------------------------------------+
    1 row in set (0.00 sec)
    mysql> select * from students;
    ERROR 1142: select command denied to user: 'newuser2@localhost' for table 'students'
    mysql>

若想再进一步细化权利范围,比如限定newuser2@localhost只能修改students表中的sname列,命令如下:

        GRANT UPDATE(sname) ON student_course.students TO newuser2@localhost IDENTIFIED BY
"password"

6.1.2 控制权限传递

上面介绍了如何创建一个用户及对其授权,可用WITH GRANT OPTION子句来控制权限的传递。例如,如果要让tom能从host1进行连接并管理sales数据库中所有表,并能够将这个权限传递给其他用户,应使用下列GRANT语句:

    GRANT ALL ON student_courses.*
    TO tom@host1 IDENTIFIED BY "password"
    WITH GRANT OPTION

WITH GRANT OPTION子句允许将用户的权限授予给另一个用户,具有GRANT权限的两个用户可以相互授予自己的权限。如果只给一个用户授予SELECT权限,而给另一个用户除SELECT外还授予了其的权限,则第二个用户可以通过权限传递,使第一个用户更加“强大”。

6.1.3 取消权限和删除用户

为了收回某个用户的权限,可使用REVOKE语句。除了要用FROM替换TO,并且没有IDENTIFIED BY或WITH GRANT OPTION子句外,REVOKE的语法与GRANT语句非常相似:

    REVOKE privileges (columns) ON what FROM user

其中,user为想要取消权限的用户名,privileges为想要取消的权限。例如,下面命令取消newuser1的所有权限:

    mysql> REVOKE ALL ON student_course FROM newuser1@localhost;

REVOKE语句只删除权限,而不删除用户。即使取消了该用户的所有权限,用户仍然保留在系统(user表)中,这意味着该用户仍然可连接服务器。要想删除整个用户,必须用DELETE语句将该用户的记录从user表中直接删除:

    DELETE FROM user WHERE User="username" and Host="hostname";

例如,下面命令删除newuser1@localhost用户:

    mysql> use mysql
    Database changed
    mysql> DELETE FROM user
        -> WHERE User="newuser1" and Host="localhost";
    mysql> FLUSH PRIVILEGES;

其中,DELETE语句删除该用户,FLUSH语句告诉服务器重新加载授权表。

6.1.4 了解MySQL的用户管理表

前面两节介绍了如何使用GRANT和REVOKE来管理用户和权限,作为MySQL管理员,应该更进一步了解MySQL的用户和权限管理表。MySQL把用户和权限信息保存在一个叫做mysql数据库中。该数据库至少包含了四个表,如表6-2所示。

表6-2 MySQL的用户权限表

GRANT和REVOKE语句影响上面四个表,当通过GRANT为用户授权时,MySQL在user表中为该用户创建一个项。

● 如果GRANT语句授予用户所有全局权限,则这些权限也记录在user表中。

● 如果GRANT语句只授予该用户数据库、表或列上的权限,则这些权限将被分别记录在db、tables_priv和columns_priv表中。

使用GRANT和REVOKE语句比直接修改授权表更容易。例如,下面的命令通过update命令直接修改user表,来更改root用户的密码:

    % mysql -u root mysql
    % UPDATE user SET
        password=password('new_password')
        where user='root';
    % FLUSH PRIVILEGES