精华内容
下载资源
问答
  • mysql用户权限管理
    千次阅读
    2020-04-24 20:09:41

    在这里插入图片描述

    一、用户

    1. 用户的概念:用户可以登陆数据库和管理数据库,因为数据库安全问题和业务需求我们需要使用权限管理。
    2. 定义用户:用户名@‘IP白名单’ (白名单指的是允许登陆MySQL的IP地址)
      • cooh@‘localhost’:cooh只能在本地使用socket登入MySQL
      • cooh@‘10.0.0.01’:cooh只能通过 1.0.0.01 远程登入MySQL
      • cooh@‘10.0.0.%’: cooh可以通过 1.0.0.xx 远程登入MySQL
      • cooh@‘10.0.0.0/255.255.254.0’:子网掩码认证登入MySQL
    3. 查询用户
      select user, host, authentication_string
      from user;
      
      userHostauthentication_string
      rootlocalhost*13E2C5B0B4E64D072DF491DE5255E17ED91EBC8F
      mysql.sessionlocalhost*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
      mysql.syslocalhost*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
    4. 创建用户
      -- 创建一个名为 user2 的用户密码为 mysql 不限定ip链接
      create user user2@'%' identified by 'mysql';
      
      注意:MySQL 8.0 版本必须先创建用户再授权 v5.0系列的版本创建和授权可以同时进行,需要注意的是新创建的用户如果没有指定权限默认只有登陆的权限。
    5. 修改用户
      -- 修改user2用户的密码为 A186
      alter user user2@'%' identified by 'A186';
      
    6. 删除用户
      -- 删除用户2
      drop user user2@'%';
      

    二、权限管理

    1. 权限概念:限定用户对数据库对操作,表现方式为增删改查。

    2. 查看权限:show privileges;

      PrivilegeContextComment
      AlterTablesTo alter the table
      Alter routineFunctions,ProceduresTo alter or drop stored functions/procedures
      CreateDatabases,Tables,IndexesTo create new databases and tables
      Create routineDatabasesTo use CREATE FUNCTION/PROCEDURE
      Create temporary tablesDatabasesTo use CREATE TEMPORARY TABLE
      Create viewTablesTo create new views
      Create userServer AdminTo create new users
      DeleteTablesTo delete existing rows
      DropDatabases,TablesTo drop databases, tables, and views
      EventServer AdminTo create, alter, drop and execute events
      ExecuteFunctions,ProceduresTo execute stored routines
      FileFile access on serverTo read and write files on the server
      Grant optionDatabases,Tables,Functions,ProceduresTo give to other users those privileges you possess
      IndexTablesTo create or drop indexes
      InsertTablesTo insert data into tables
      Lock tablesDatabasesTo use LOCK TABLES (together with SELECT privilege)
      ProcessServer AdminTo view the plain text of currently executing queries
      ProxyServer AdminTo make proxy user possible
      ReferencesDatabases,TablesTo have references on tables
      ReloadServer AdminTo reload or refresh tables, logs and privileges
      Replication clientServer AdminTo ask where the slave or master servers are
      Replication slaveServer AdminTo read binary log events from the master
      SelectTablesTo retrieve rows from table
      Show databasesServer AdminTo see all databases with SHOW DATABASES
      Show viewTablesTo see views with SHOW CREATE VIEW
      ShutdownServer AdminTo shut down the server
      SuperServer AdminTo use KILL thread, SET GLOBAL, CHANGE MASTER, etc.
      TriggerTablesTo use triggers
      Create tablespaceServer AdminTo create/alter/drop tablespaces
      UpdateTablesTo update existing rows
      UsageServer AdminNo privileges - allow connect only

      上表为MySQL的所有权限和操作对象及介绍,我们设定权限的时候可以参考使用。

    3. 设置权限
      前提:给其它用户设置权限的前提是 root 或者你拥有权限并拥有 Grant option(将自己的权限赋予其他用户的权限)
      设置方式:

      1. ALL:指所有权限,前提是你使用的用户拥有的权限
      2. 权限1,权限2:可以指定具体的权限面向普通用户
      3. Grant option:给其它用户授权

      对象范围:

      • *.* 指数据库中所有的库和表
      • 库名.* 指定数据库中所有定表
      • 库名.表名 指定数据库中定指定表

      -- 将数据库new_data中的new表中的 new_title、new_content 查询权限给 user1
      grant select(new_title, new_content) on new_data.new to user1@'localhost';
      

      如果需要查询创建的权限需要到指定的表中查找:

      • User:存储创建的用户和密码包括全局实例级别管理权限设置
      • db:存储数据库级别的权限设置
      • tables_priv:存放表级别的设置权限
      • columns_priv:存放字段级别的设置权限
      • procs_priv:存放存储过程中的设置权限

      -- 查询列级别的权限
      select * from mysql.columns_priv;
      
      HostDbUserTable_nameColumn_nameTimestampColumn_priv
      localhostnew_datauser1newnew_content0000-00-00 00:00:00Select
      localhostnew_datauser1newnew_title0000-00-00 00:00:00Select

      上表为权限查询结果

    4. 回收权限
      回收权限使用 revoke 权限 on 范围 form 用户名@host

      -- 回收相关字段的权限
      revoke select(new_content, new_title) on new_data.new from user1@'localhost';
      

    1. 授权权限
      给 grant 添加 WITH GRANT OPTION 子句,表示该用户可以将自己拥有的权限授予其它用户。
    更多相关内容
  • MySQL用户权限管理

    千次阅读 2019-06-20 22:20:36
    MySQL用户权限管理 知识要点 了解mysql的默认用户 权限的分类 用户的创建 给用户授权 废除用户权限 MySQL的认证方式 用户名 密码 登录地址 root@localhost(登录主机的地址—客户端) 密码 客户端:要通过什么...

    MySQL用户权限管理

    知识要点
    了解mysql的默认用户
    权限的分类
    用户的创建
    给用户授权
    废除用户权限

    MySQL的认证方式
    用户名 密码 登录地址
    root@localhost(登录主机的地址—客户端) 密码
    客户端:要通过什么用户通过什么密码登录服务器
    用户名 密码 要登录的服务器的ip地址 服务器提供的mysql服务的端口号

    服务端:验证客户端的登录信息是否在我的用户表里
    认证三项:用户名 密码 客户端的登录主机(host)
    mysql.user表(涉及到客户端连接)

    补充: mysql> desc mysql.user; ##desc查看mysql.user表中列的属性,包括用户名 登录主机 还有各类的权限表,密码的相关属性 enum是指枚举
    在这里插入图片描述

    type是指类型 null是指是否允许为空 key是指有没有索引 default是指有没有默认值 extra是备注

    mysql> select user,host,authentication_string from mysql.user; ##在mysql.user表里查看用户名 登录主机 密码(在高版本中密码不以明文存储)的等信息
    在这里插入图片描述

    了解mysql默认的用户

    当全新的MySQL数据库安装完毕后,系统就为我们默认地创建了几个用户:管理员用户root以及匿名用户。通过查看名为mysql的系统数据库中的user表,可以看到所有的用户名及其全局权限(Global Privileges)

    mysql> select user,host from mysql.user;
    ±--------------±----------+
    | user | host |
    ±--------------±----------+
    | mysql.session | localhost |
    | mysql.sys | localhost | #没有全局权限
    | root | localhost | # mysql的超级管理员,拥有全部的全局权限
    ±--------------±----------+
    6 rows in set (0.00 sec)

    mysql>

    1.mysql> select * from mysql.user\G ##查看mysql.user表中所有列的信息 \G显示比较清晰。通过显示输出可以看到 root @localhost拥有全部的全局权限。mysql.sys没有全局权限

    2.mysql> show grants for ‘mysql.sys’@‘localhost’; ##查看mysql.sys的权限表
    ±--------------------------------------------------------------+
    | Grants for mysql.sys@localhost |
    ±--------------------------------------------------------------+
    | GRANT USAGE ON . TO ‘mysql.sys’@‘localhost’ |
    | GRANT TRIGGER ON sys.* TO ‘mysql.sys’@‘localhost’ | #TRIGGER触发器权限
    | GRANT SELECT ON sys.sys_config TO ‘mysql.sys’@‘localhost’ | # 有sys数据库的sys_config表的SELECT权限
    ±--------------------------------------------------------------+
    3 rows in set (0.01 sec)

    3.mysql> show privileges; ##查看总的权限表
    Usage | Server Admin | No privileges - allow connect only ##没有权限,只是允许连接

    4.‘mysql.sys’@’localhost’:
    用于 sys schema中对象的定义。使用 mysql.sys 用户可避免DBA重命名或者删除root用户时发生的问题。该用户已被锁定,客户端无法连接。

    5.‘mysql.session’@’localhost’:
    插件内部使用来访问服务器。该用户已被锁定,客户端无法连接。

    6.‘root’@’localhost’:
    其用于管理。该用户拥有所有权限,可执行任何操作

    7.权限:不要轻易的授权给用户超级权限,授予给用户的权限只要满足用户的操作即可,不 要赋予多余权限 (select/insert/delete/update)

    了解不存在用户的默认行为

    1.在低版本中存匿名用户(不存在用户)的概念,使用匿名用户登录时,可以不使用密码,随便一个用户名就能登录,也不会检查登录主机,但是匿名用户的权限非常低,不会对数据库自身造成影响。但危害是在正常存在的用户在登录,有可能会被认为是匿名用户

    2.在刚创建低版本mysql时可以使用mysql> select user,host from mysql.user;检查匿名用户是否存在
    删除匿名用户(delete from mysql.user where user=’’;)匿名用户的特点是mysql.user表中user的列值=’’;

    3.真实存在的用户有生产库/业务库的真实权限

    4.可见,匿名用户有权看到两个数据库:一个名为information_schema的系统数据库和一个test数据库。它对test数据库拥有全部权限,可以在里面创建表,进行DML操作(修删改查)等。对information_schema系统数据库中的表拥有查询权限,但是不能执行DML操作

    5.低版本数据库存在,高版本已经不允许匿名用户登录数据库,系统中不存在匿名用户

    权限分类
    语法:grant 权限操作分类 on 数据库作用范围权限分类 to 某个用户;

    按照权限的授予级别,可分成以下几类:
    show privileges; ##查看数据库中支持的权限有哪些

    数据库作用范围权限分类
    1.全局权限Global Privileges:测试举例
    它是管理权限,作用到服务器上的所有数据库。要授予全局权限,使用 ON *.的语法,.*表示所有数据库的所有表(对象,视图等)中。MySQL 把全局权限保存在 mysql.user 表中

    2.数据库权限Database Privileges:测试举例
    作用到某个特定数据库的所有对象上。要授予数据库权限,使用 ON db_name.* 的语法,db_name.*表示db_name数据库下的所有表(对象,视图等)。 MySQL 把数据库权限保存在 mysql.db 表中

    3.表权限Table Privileges:测试举例
    应用到某个特定表的所有列上。要授予表权限,使用 ON db_name.tbl_name 的语法。 MySQL 把表权限保存在 mysql.tables_priv 表中

    4.列权限

    权限操作分类: 使用逗号分隔
    1.列权限
    作用在特定表的特定列上,在权限操作分类中体现列权限 select(col_name),记录到mysql.columns_prive表中 field

    2.存储过程权限
    作用在存储过程和函数上,记录到mysql.procs_prive表中 procedure

    3.代理用户权限
    作用是使一个用户成为另一个用户的代理,记录到mysql.proxies_priv表中 proxy

    具体分类
    在grant和revoke语句中可用的权限如下表所示:
    在这里插入图片描述在这里插入图片描述

    补充:
    1.ALL权限 谨慎对待 包含着管理数据库的权限
    在mysql.user表中,除了Grant_priv是N外,所有的_prive结尾的列值都是Y
    grant option:表示我自己有的权限可以授权给别人

    2.event-mysql的时间调度-linux下的crontab

    3.mysql> show processlist; #查看当前正在运行的进程列表
    在这里插入图片描述

    command是指执行了什么操作 state是指状态 info是指执行语句 id进程号(可以使用kill杀死)

    权限检查顺序
    Mysql数据库下的表user(全局权限)、db(数据库权限)、tables_priv(表权限)、columns_priv(列权限)、procs_priv(存储过程权限)、proxies_priv(代理用户权限)共同构成授权表
    权限检查顺序如下图:
    在这里插入图片描述

    创建用户

    create user的使用语句
    CREATE USER user_specification [, user_specification] …
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] …}]
    [WITH resource_option [resource_option] …]
    [password_option | lock_option] …
    user_specification:
    user_name [ auth_option ]

    auth_option: {认证选项
    IDENTIFIED BY ‘auth_string’
    | IDENTIFIED BY PASSWORD ‘hash_string’
    | IDENTIFIED WITH auth_plugin
    | IDENTIFIED WITH auth_plugin AS ‘hash_string’
    | IDENTIFIED WITH auth_plugin BY ‘auth_string’
    }

    ssl_option: {加密连接选项
    SSL | X509 | CIPHER ‘cipher’
    | ISSUER 'issuer‘ | SUBJECT ‘subject’
    }

    resource_option: {使用资源选项 ##说明:是对使用资源的限制
    MAX_QUERIES_PER_HOUR count ##最大的资源访问量
    | MAX_UPDATES_PER_HOUR count ##每小时最大更新
    | MAX_CONNECTIONS_PER_HOUR count ##每小时最大连接
    | MAX_USER_CONNECTIONS count ##每小时最大的连接数量
    }

    password_option: {密码过期选项
    PASSWORD EXPIRE --立即过期
    | PASSWORD EXPIRE DEFAULT --360天 ##指定过期的天数,360天可以换成任意天数
    | PASSWORD EXPIRE NEVER ##永不过期
    | PASSWORD EXPIRE INTERVAL N DAY ##间隔多少天后过期
    }

    lock_option: {账户锁定选项
    ACCOUNT LOCK ##账号锁定
    | ACCOUNT UNLOCK ##账号解锁
    }

    注意:上述语法中,在MySQL 5.7.6之前,只有第1行的create user子句
    和其它数据库不同,MySQL使用用户名、密码和登录位置来验证用户

    补充:使用grant也可以新建用户
    grant all on . to ‘u1’@’%’ identified by ‘123’ with grant option; ##新建一个u1@%用户,这个用户有所有权限

    如果不加密码也想创建成功的话,需要执行下面的语句
    mysql> show variables like ‘sql_mode’;
    ±--------------±------------------------------------------------------------------------------------------------------------------------------------------+
    | Variable_name | Value |
    ±--------------±------------------------------------------------------------------------------------------------------------------------------------------+
    | sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    ±--------------±------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    mysql> set @@session.sql_mode=‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’; ##去掉 NO_AUTO_CREATE_USER不自动创建用户

    Query OK, 0 rows affected, 1 warning (0.00 sec)

    mysql> grant all on . to ‘u22’@’%’ with grant option; ##创建没有密码的u22成功
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    示例1:创建一个新用户demo,密码为demo,允许从本机登录
    create user ‘demo’@‘localhost’ identified by ‘demo’;
    注意:用户名和主机名要分别用引号括起来(如果用户名没有特殊字符,主机名没有特殊字符和通配符%,也可以不加引号)。密码必须用引号括起来
    如果不指定主机名,默认的主机名是百分号%,它代表任意主机
    例如:在这里插入图片描述

    示例2:创建一个新用户demo1,密码为demo1,允许从任意主机登录
    create user ‘demo1’ identified by ‘demo1’;
    或者
    create user ‘demo1’ @’%’ identified by ‘demo1’;

    示例3:创建一个新用户demo2,没有密码,允许从任意主机登录
    create user ‘demo2’;
    注意:如果两个用户具有相同的用户名但是主机名不同,MySQL把他们看做不同的用户
    如果创建的用户已经存在,则抛出异常

    当create user语句执行成功后,便在授权表mysql.user中写上一行

    示例4:查询所有的用户账户
    select user,host,authentication_string(认证字符串) from mysql.user;
    一个新用户创建出来后,它可以连接到数据库,并有权看到information_schema的系统数据库。对information_schema系统数据库中的表拥有查询权限,但是不能执行DML(增删改查等)操作。如果还想进行其它操作,必须给他授权

    mysql的登录方式
    1)本地socket方式
    msql -uroot -p123 -S /usr/local/mysql/data/mysql.sock
    2)网络方式
    127.0.0.1(本地回环)—识别成了localhost
    IP地址—网络

    修改用户名

    语法:该语句不影响用户的密码
    RENAME USER old_user TO new_user
    [, old_user TO new_user] …

    示例5:将用户demo1和demo2分别改名为newdemo1和newdemo2
    rename user
    ‘demo1’@‘localhost’ to ’newdemo1’@‘127.0.0.1’,
    ‘demo3’@’%’ to ‘newdemo2’@‘127.0.0.1’;
    注:修改用户名时一定要将主机名写上,否则会创建登录主机是%的用户

    修改密码

    一共有三种方式,
    1.set password for ‘u1’@’%’ =password(‘123’)
    2. alter user ‘u1’@’%’ identified by ‘123’ 推荐使用
    3. grant all on . to ‘u1’@’%’ identified by ‘123’
    注意:从5.7.6 版本开始,grant语句不提倡使用( is deprecated )。使用ALTER USER语句代替:
    ALTER USER user_name IDENTIFIED BY 'auth_string‘;
    在这里插入图片描述

    SET PASSWORD语法
    SET PASSWORD [FOR user_name] = password_option;
    password_option: {
    PASSWORD(‘auth_string’)
    | ‘auth_string‘ --只适合5.7.6及其之后的版本
    | ‘hash_string‘ --只适合5.7.6之前的版本
    }
    ‘auth_string’:未加密的明文字符串密码。PASSWORD函数将其加密后保存。 ‘hash_string’:已经加密的密码

    示例6:修改自己的密码
    set password=password(‘123’);
    如果你具有mysql数据库的update权限,就可以修改别人的密码

    示例7:修改demo用户的密码
    set password for demo@127.0.0.1 =password(‘123’);

    给用户授权

    GRANT的适用语法
    GRANT priv_type [(column_list)]
    [, priv_type [(column_list)]] …
    ON [object_type] priv_level
    TO user_specification [, user_specification] …
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] …}]
    [WITH {GRANT OPTION | resource_option} …]
    object_type: {
    TABLE | FUNCTION | PROCEDURE
    }
    priv_level: {
    * | . | db_name.* | db_name.tbl_name
    | tbl_name | db_name.routine_name
    }
    user_specification:
    user_name [ auth_option ]
    auth_option: { # As of MySQL 5.7.6
    IDENTIFIED BY ‘auth_string’
    | IDENTIFIED BY PASSWORD ‘hash_string’
    | IDENTIFIED WITH auth_plugin
    | IDENTIFIED WITH auth_plugin AS ‘hash_string’
    | IDENTIFIED WITH auth_plugin BY ‘auth_string’
    }

    ssl_option: {
    SSL | X509 | CIPHER 'cipher’ | ISSUER ‘issuer’
    | SUBJECT ‘subject’
    }

    resource_option: {
    | MAX_QUERIES_PER_HOUR count
    | MAX_UPDATES_PER_HOUR count
    | MAX_CONNECTIONS_PER_HOUR count
    | MAX_USER_CONNECTIONS count
    }

    授予表权限
    注意:如果被授权的用户不存在,那么grant语句会自动创建新的账户,除非设置参数sql_mode包含“NO_AUTO_CREATE_USER” 。

    mysql> grant all on test.a to ‘bbb’@‘localhost’;
    ERROR 1133 (42000): Can’t find any matching row in the user table
    mysql> grant all on test.a to ‘bbb’@‘localhost’ identified by ‘123’; ##新建了bbb用户
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    mysql> show warnings; ##查看告警信息
    ±--------±-----±-----------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message |
    ±--------±-----±-----------------------------------------------------------------------------------------------------------------------------------+
    | Warning | 1287 | Using GRANT for creating new user is deprecated and will be removed in future release. Create new user with CREATE USER statement. |
    ±--------±-----±-----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    授予列权限

    示例9:授予用户bob可以对test.a表的id和name列进行更新
    grant update(id,name)
    on test.a
    to ‘bob’@‘localhost’;
    注意:权限都是单独授予的,对某个表具有update权限不会导致自动得到select权限

    授予数据库权限

    表权限只针对某一张表,可针对整个数据库授权
    示例10:授予bob可以对test数据库中的所有表进行查询
    grant select
    on test.* ## test.表示test数据库中的所有表
    to bob;
    示例11:授予jim在 test数据库中创建、修改、删除表的权限以及创建视图的权限
    grant create,alter,drop,create view
    on test.

    to jim;

    授予全局权限

    示例12:授予jim可以对当前数据库中的所有表进行查询
    grant select
    on *
    to jim;
    *号表示当前数据库
    授予全局权限,应用到所有数据库上

    示例13:授予jim可以创建、删除数据库以及对所有数据库中的所有表进行create、alter和drop
    grant create,alter,drop
    on . ##*.*也可以更换为其他具体的数据库
    to jim;

    示例14:授予jim可以创建新用户
    grant create user
    on .
    to jim;

    示例15:授予newroot1具有和root@localhost一样的权限
    grant all
    on .
    to ‘newroot1’@’localhost’ with grant option; ##with grant option表示也可以授予别人权限
    查看自己的权限 查看别人的权限:
    show grants; show grants for 用户;

    权限的传递

    with grant option子句
    通过在grant语句的最后使用该子句,就允许被授权的用户把得到的权限继续授给其它用户

    示例16:授予jim对ceshi表具有select权限,并允许他把权限授给其它用户
    grant select on test.ceshi to jim with grant option;

    以jim连接登录,执行:
    grant select on test.ceshi to bob;

    废除权限
    REVOKE
    priv_type [(column_list)]
    [, priv_type [(column_list)]] …
    ON [object_type] priv_level
    FROM user [, user] …

    —废除用户在所有级别上的权限:
    REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] …

    示例17:废除aaa用户对ceshi表的查询权限
    REVOKE ALL PRIVILEGES ON test.ceshi from ‘aaa’@‘localhost’;

    再以aaa执行查询:
    mysql> select * from test.ceshi;
    ERROR 1142 (42000): SELECT command denied to user ‘aaa’@‘localhost’ for table ‘ceshi’
    mysql>

    示例18:废除jim对test.ceshi 表的select权限
    revoke select on test.ceshi from jim;
    因为jim通过with grant option把该权限又授给了bob,因此bob也失去了对test.ceshi 表的select权限

    示例19:要废除jim得到的with grant权限,使用以下语句:
    revoke grant option on test.ceshi from jim;

    常见问题

    主机名使用localhost还是127.0.0.1?
    使用localhost,是通过socket来连接;
    使用127.0.0.1,是通过tcp/ip来连接 ##使用本地回环
    不要把mysql系统数据库的权限授给用户 ##mysql系统数据库里面有很多权限表
    不要随便授予super权限 ##super是管理数据库的权限
    show privileges;
    用户具有usage权限意味着“没有权限”,它只表示该用户可以连接到数据库。无法废除该权限

    select * from mysql.tables_prive ##查看所有表的权限

    select * from mysql.columns_prive ##查看所有列的权限

    select * from mysql.db ##查看mysql数据库的所有表的信息

    select connection_id(); ##查看当前回话的编号

    select * from sys.session; ##查看编号对应的用户名等信息

    展开全文
  • mysql用户权限管理

    千次阅读 2022-01-15 16:07:53
    二、权限管理 1、 权限列表 2、 授予权限的原则 3、 授予权限 4、 查看权限 5、收回权限 三、权限表 1、user表 2、db表 3、 tables_priv表和columns_priv表 4、 procs_priv表 四、访问控制 1、连接核实...

    目录

    一、用户管理

    1、登录mysql

    2、创建用户

    3、更新用户

    4、删除用户

    5、 设置当前用户密码

    6、修改其他用户密码

    7、 MySQL8密码管理(了解

    7.1、密码过期策略

    7.2、密码重置策略

    二、权限管理

    1、 权限列表

    2、 授予权限的原则

    3、 授予权限

    4、 查看权限

    5、收回权限

    三、权限表

    1、user表

    2、db表

    3、 tables_priv表和columns_priv表

    4、 procs_priv表

    四、访问控制

    1、连接核实阶段

    2、 请求核实阶段

    五、角色管理

    1、创建角色

    2、给角色赋予权限

    3、查看角色权限

    4、回收角色权限

    5、删除角色

    6、给用户赋予角色

    7、激活角色

    8、撤销用户角色

    9、设置强制角色


    一、用户管理

    1、登录mysql

    mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"
    比如
    mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"

    -h参数 后面接主机名或者主机IP,hostname为主机,hostIP为主机IP。

    -P参数 后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306,

    不使用该参数时自动连接到3306端口,port为连接的端口号。

    -u参数 后面接用户名,username为用户名。

    -p参数 会提示输入密码。

    DatabaseName参数 指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库

    中,然后可以使用USE命令来选择数据库。

    -e参数 后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL

    服务器。

    2、创建用户

    CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
    比如
    CREATE USER 'kangshifu'@'localhost' IDENTIFIED BY '123456';

    用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成;

    “[ ]”表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户

    可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用

    IDENTIFIED BY指定明文密码值。

    CREATE USER语句可以同时创建多个用户。

    3、更新用户

    UPDATE mysql.user SET USER='li4' WHERE USER='wang5';
    FLUSH PRIVILEGES;

    4、删除用户

    方式1:使用DROP方式删除(推荐)

    使用DROP USER语句来删除用户时,必须用于DROP USER权限。DROP USER语句的基本语法形式如下

    DROP USER user[,user]…;
    比如
    DROP USER li4 ; # 默认删除host为%的用户
    DROP USER 'kangshifu'@'localhost';

    方式2:使用DELETE方式删除

    DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;
    FLUSH PRIVILEGES;
    比如
    DELETE FROM mysql.user WHERE Host='localhost' AND User='Emily';
    FLUSH PRIVILEGES;

    注意:不推荐通过 DELETE FROM USER u WHERE USER='li4' 进行删除,系统会有残留信息保 留。而drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表 的相应记录都消失了。

    5、 设置当前用户密码

    旧的写法

    # 修改当前用户的密码:(MySQL5.7测试有效)
    SET PASSWORD = PASSWORD('123456');

    推荐写法

    1. 使用ALTER USER命令来修改当前用户密码 用户可以使用ALTER命令来修改自身密码,如下语句代表修 改当前登录用户的密码。基本语法如下:

    ALTER USER USER() IDENTIFIED BY 'new_password';

    2. 使用SET语句来修改当前用户密码 使用root用户登录MySQL后,可以使用SET语句来修改密码,具体 SQL语句如下: 该语句会自动将密码加密后再赋给当前用户。

    SET PASSWORD='new_password';

    6、修改其他用户密码

    1. 使用ALTER语句来修改普通用户的密码 可以使用ALTER USER语句来修改普通用户的密码。基本语法形 式如下:

    ALTER USER user [IDENTIFIED BY '新密码']
    [,user[IDENTIFIED BY '新密码']]…;

    2. 使用SET命令来修改普通用户的密码 使用root用户登录到MySQL服务器后,可以使用SET语句来修改普 通用户的密码。SET语句的代码如下:

    SET PASSWORD FOR 'username'@'hostname'='new_password';

    3. 使用UPDATE语句修改普通用户的密码(不推荐)

    UPDATE MySQL.user SET authentication_string=PASSWORD("123456")
    WHERE User = "username" AND Host = "hostname";

    7、 MySQL8密码管理(了解

    7.1、密码过期策略

    在MySQL中,数据库管理员可以 手动设置 账号密码过期,也可以建立一个 自动 密码过期策略。 过期策略可以是 全局的 ,也可以为 每个账号 设置单独的过期策略

    ALTER USER user PASSWORD EXPIRE;
    比如
    ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE;

    方式①:使用SQL语句更改该变量的值并持久化

    SET PERSIST default_password_lifetime = 180; # 建立全局策略,设置密码每隔180天过期

    方式②:配置文件my.cnf中进行维护

    [mysqld]
    default_password_lifetime=180 #建立全局策略,设置密码每隔180天过期

    手动设置指定时间过期方式2:单独设置

    每个账号既可延用全局密码过期策略,也可单独设置策略。在 CREATE USER 和 ALTER USER 语句上加 入 PASSWORD EXPIRE 选项可实现单独设置策略。下面是一些语句示例。

    #设置kangshifu账号密码每90天过期:
    CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    #设置密码永不过期:
    CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
    ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
    #延用全局密码过期策略:
    CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;
    ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;

    7.2、密码重置策略

    手动设置密码重用:全局

    方式1:使用sql
    SET PERSIST password_history = 6; #设置不能选择最近使用过的6个密码
    SET PERSIST password_reuse_interval = 365; #设置不能选择最近一年内的密码
    方式2:配置文件
    [mysqld]
    password_history=6
    password_reuse_interval=365

    手动设置密码重用:单独设置

    #不能使用最近5个密码:
    CREATE USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
    ALTER USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
    #不能使用最近365天内的密码:
    CREATE USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    #既不能使用最近5个密码,也不能使用365天内的密码
    CREATE USER 'kangshifu'@'localhost'
    PASSWORD HISTORY 5
    PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'kangshifu'@'localhost'
    PASSWORD HISTORY 5
    PASSWORD REUSE INTERVAL 365 DAY;

    二、权限管理

    1、 权限列表

    MySQL到底都有哪些权限呢?

    mysql> show privileges;

    (1) CREATE和DROP权限 ,可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将 MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。 (2) SELECT、INSERT、UPDATE和DELETE权限 允许在一个数据库现有的表上实施操作。 (3) SELECT权限 只有在它们真正从一个表中检索行时才被用到。 (4) INDEX权限 允许创建或删除索引,INDEX适用于已 有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。 (5) ALTER权 限 可以使用ALTER TABLE来更改表的结构和重新命名表。 (6) CREATE ROUTINE权限 用来创建保存的 程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序, EXECUTE权限 用来执行保存的 程序。 (7) GRANT权限 允许授权给其他用户,可用于数据库、表和保存的程序。 (8) FILE权限 使用 户可以使用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权 限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务 器可以访问这些文件)。

    2、 授予权限的原则

    权限控制主要是出于安全因素,因此需要遵循以下几个 经验原则 :

    1、只授予能 满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可 以了,不要给用户赋予update、insert或者delete权限。

    2、创建用户的时候 限制用户的登录主机 ,一般是限制成指定IP或者内网IP段。

    3、为每个用户 设置满足密码复杂度的密码 。

    4、 定期清理不需要的用户 ,回收权限或者删除用户。

    3、 授予权限

    给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。用户是数据库的 使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全 隐患。 授权命令:

    GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
    比如给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限
    GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost ;
    
    比如授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包
    括grant的权限
    GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';

    我们在开发应用的时候,经常会遇到一种需求,就是要根据用户的不同,对数据进行横向和纵向的 分组。 所谓横向的分组,就是指用户可以接触到的数据的范围,比如可以看到哪些表的数据;

    所谓纵向的分组,就是指用户对接触到的数据能访问到什么程度,比如能看、能改,甚至是 删除。

    4、 查看权限

    查看当前用户权限

    SHOW GRANTS;
    # 或
    SHOW GRANTS FOR CURRENT_USER;
    # 或
    SHOW GRANTS FOR CURRENT_USER();

    查看某用户的全局权限

    SHOW GRANTS FOR 'user'@'主机地址' ;

    5、收回权限

    收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全 性。MySQL中使用 REVOKE语句 取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从 db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中 的账户记录使用DROP USER语句)。 注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。

    REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
    比如
    #收回全库全表的所有权限
    REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
    #收回mysql库下的所有表的插删改查权限
    REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;
    

    注意: 须用户重新登录后才能生效

    三、权限表

    1、user表

    user表是MySQL中最重要的一个权限表, 记录用户账号和权限信息 ,有49个字段。如下图:

    这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列

    范围列(或用户列)

    权限列

    安全列

    安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于 加密 ;两个是x509 相关的(x509_issuer、x509_subject),用于 标识用户 ;另外两个Plugin字段用于 验证用户身份 的插件, 该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份。

    资源控制列

    资源控制列的字段用来 限制用户使用的资源 ,包含4个字段,分别为: ①max_questions,用户每小时允许执行的查询操作次数; ②max_updates,用户每小时允许执行的更新 操作次数; ③max_connections,用户每小时允许执行的连接操作次数; ④max_user_connections,用户 允许同时建立的连接次数。 查看字段:

    DESC mysql.user;

    查看用户, 以列的方式显示数据: SELECT * FROM mysql.user \G;

    查询特定字段:

    SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv
    FROM mysql.user;

    2、db表

    使用DESCRIBE查看db表的基本结构: DESCRIBE mysql.db;

    1. 用户列 db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库 名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。

    2. 权限列 Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。

    3、 tables_priv表和columns_priv表

    tables_priv表用来 对表设置操作权限 ,columns_priv表用来对表的 某一列设置权限 。tables_priv表和 columns_priv表的结构分别如图: desc mysql.tables_priv;

    tables_priv表有8个字段,分别是Host、Db、User、Table_name、Grantor、Timestamp、Table_priv和 Column_priv,各个字段说明如下:

    Host 、 Db 、 User 和 Table_name 四个字段分别表示主机名、数据库名、用户名和表名。

    Grantor表示修改该记录的用户。

    Timestamp表示修改该记录的时间。

    Table_priv 表示对象的操作权限。包括Select、Insert、Update、Delete、Create、Drop、Grant、

    References、Index和Alter。

    Column_priv字段表示对表中的列的操作权限,包括Select、Insert、Update和References。

    desc mysql.columns_priv;

    4、 procs_priv表

    procs_priv表可以对 存储过程和存储函数设置操作权限 ,表结构如图: desc mysql.procs_priv;

    四、访问控制

    1、连接核实阶段

    当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确 定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器 接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信 息。 服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受 连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待 用户请求。

    2、 请求核实阶段

    一旦建立了连接,服务器就进入了访问控制的阶段2,也就是请求核实阶段。对此连接上进来的每个请 求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发 挥作用的地方。这些权限可以来自user、db、table_priv和column_priv表。 确认权限时,MySQL首先 检查user表 ,如果指定的权限没有在user表中被授予,那么MySQL就会继续 检 查db表 ,db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指 定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续 检查tables_priv表 以 及 columns_priv表 ,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将 返回错 误信息 ,用户请求的操作不能执行,操作失败。

    提示: MySQL通过向下层级的顺序(从user表到columns_priv表)检查权限表,但并不是所有的权 限都要执行该过程。例如,一个用户登录到MySQL服务器之后只执行对MySQL的管理操作,此时只 涉及管理权限,因此MySQL只检查user表。另外,如果请求的权限操作不被允许,MySQL也不会继 续检查下一层级的表。

    五、角色管理

    1、创建角色

    CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...

    角色名称的命名规则和用户名类似。如果 host_name省略,默认为% , role_name不可省略 ,不可为 空。

    练习:我们现在需要创建一个经理的角色,就可以用下面的代码:

    CREATE ROLE 'manager'@'localhost';

    2、给角色赋予权限

    创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。给角色授权的语法结构是:

    GRANT privileges ON table_name TO 'role_name'[@'host_name'];

    上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称,图11-43 列出了部分权限列表。

    SHOW PRIVILEGES\G;

    练习1:我们现在想给经理角色授予商品信息表、盘点表和应付账款表的只读权限,就可以用下面的代码 来实现:

    GRANT SELECT ON demo.settlement TO 'manager';
    GRANT SELECT ON demo.goodsmaster TO 'manager';
    GRANT SELECT ON demo.invcount TO 'manager';

    3、查看角色权限

    赋予角色权限之后,我们可以通过 SHOW GRANTS 语句,来查看权限是否创建成功了:

    只要你创建了一个角色,系统就会自动给你一个“ USAGE ”权限,意思是 连接登录数据库的权限 。代码的 最后三行代表了我们给角色“manager”赋予的权限,也就是对商品信息表、盘点表和应付账款表的只读权 限。 结果显示,库管角色拥有商品信息表的只读权限和盘点表的增删改查权限。

    4、回收角色权限

    角色授权后,可以对角色的权限进行维护,对权限进行添加或撤销。添加权限使用GRANT语句,与角色 授权相同。撤销角色或角色权限使用REVOKE语句。 修改了角色的权限,会影响拥有该角色的账户的权限。 撤销角色权限的SQL语法如下:

    REVOKE privileges ON tablename FROM 'rolename';

    练习:撤销school_write角色的权限。 (

    (1)使用如下语句撤销school_write角色的权限。

    REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';

    (2)撤销后使用SHOW语句查看school_write对应的权限,语句如下。

    SHOW GRANTS FOR 'school_write';

    5、删除角色

    当我们需要对业务重新整合的时候,可能就需要对之前创建的角色进行清理,删除一些不会再使用的角 色。删除角色的操作很简单,你只要掌握语法结构就行了。

    DROP ROLE role [,role2]...

    注意, 如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限 。 练习:执行如下SQL删除角色school_read。

    DROP ROLE 'school_read';

    6、给用户赋予角色

    角色创建并授权后,要赋给用户并处于 激活状态 才能发挥作用。给用户添加角色可使用GRANT语句,语 法形式如下:

    GRANT role [,role2,...] TO user [,user2,...];

    在上述语句中,role代表角色,user代表用户。可将多个角色同时赋予多个用户,用逗号隔开即可。 练习:给kangshifu用户添加角色school_read权限。 (1)使用GRANT语句给kangshifu添加school_read权 限,SQL语句如下。

    GRANT 'school_read' TO 'kangshifu'@'localhost';

    (2)添加完成后使用SHOW语句查看是否添加成功,SQL语句如下。

    SHOW GRANTS FOR 'kangshifu'@'localhost';

    (3)使用kangshifu用户登录,然后查询当前角色,如果角色未激活,结果将显示NONE。SQL语句如 下。

    SELECT CURRENT_ROLE();

    7、激活角色

    方式1:使用set default role 命令激活角色

    SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';

    使用 SET DEFAULT ROLE 为下面4个用户默认激活所有已拥有的角色如下:

    SET DEFAULT ROLE ALL TO
    'dev1'@'localhost',
    'read_user1'@'localhost',
    'read_user2'@'localhost',
    'rw_user1'@'localhost';
    

    方式2:将activate_all_roles_on_login设置为ON

    show variables like 'activate_all_roles_on_login';

    SET GLOBAL activate_all_roles_on_login=ON;

    这条 SQL 语句的意思是,对 所有角色永久激活 。运行这条语句之后,用户才真正拥有了赋予角色的所有 权限。

    8、撤销用户角色

    REVOKE role FROM user;

    练习:撤销kangshifu用户的school_read角色。 (1)撤销的SQL语句如下

    REVOKE 'school_read' FROM 'kangshifu'@'localhost';

    (2)撤销后,执行如下查询语句,查看kangshifu用户的角色信息

    SHOW GRANTS FOR 'kangshifu'@'localhost';

    9、设置强制角色

    设置强制角色(mandatory role)

    方式1:服务启动前设置

    [mysqld]
    mandatory_roles='role1,role2@localhost,r3@%.atguigu.com'

    方式2:运行时设置

    SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后仍然 有效 SET GLOBAL mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后失效

    展开全文
  • 一文看尽MySQL用户权限管理,真香!

    千次阅读 多人点赞 2020-04-27 19:59:45
    MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化。 存储账户权限信息表主要有:user、db、tables_priv、columns_priv、procs_priv、proxies_priv这六...

    关于MySQL的权限简单的理解就是MySQL允许你做你权利以内的事情,不可以越界。MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化。

    存储账户权限信息表主要有:user、db、tables_priv、columns_priv、procs_priv、proxies_priv这六张表(5.6之前还有host表,现在已经把host内容整合进user表)

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    目录

     

    权限管理概念

    1. MySQL连接权限

    2. 操作执行权限

    3. MySQL执行权限检查顺序

    实际操作

    创建/授权用户:

    一、创建用户格式

    二、授权格式及示例:

    1. 授予管理员权限

    2. 授予数据库、表权限

    3. 授予列权限

    三、修改用户配置:

    1. 回收 mysql 权限

    2. 删除 mysql 用户

    3. 修改 mysql 用户密码

    4. 忘记密码

    5. 设置MySQL用户密码过期策略

    6. mysql 用户 lock

    7. 用户重命名

     


    权限管理概念

    MySQL用户权限管理主要有以下作用:

    1. 可以限制用户访问哪些库、哪些表
    2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
    3. 可以限制用户登录的IP或域名
    4. 可以限制用户自己的权限是否可以授权给别的用户

    用户操作MySQL数据库的权限管理,主要分为两个阶段:

    • 有没有权限连接上来
    • 有没有权限执行本操作

    1. MySQL连接权限

    服务器如何判断用户有没有权连接上来?

    依据:

    • 你从哪里来?host
    • 你是谁?user
    • 你的密码是多少?password

    用户的这三个信息,存储在mysql库中的user表中。


    2. 操作执行权限

    mysql数据库(系统数据库)下的表:user、db、tables_priv、columns_priv、proce_priv、proxies_priv共同构成授权表;

    • 1)user表

    user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

    • 2)db表

    db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

    • 3)tables_priv表

    tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

    • 4)columns_priv表

    columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。

    • 5)proce_priv

    columns_priv表指定存储过程权限。这里代表允许使用某个存储过程的权限。

    • 6)proxies_priv

    利用 MySQL proxies_priv(模拟角色)实现类似用户组管理。角色(Role)可以用来批量管理用户,同一个角色下的用户,拥有相同的权限。
    注:MySQL5.7.X以后可以模拟角色(Role)的功能,通过mysql.proxies_priv模拟实现
     

    3. MySQL执行权限检查顺序

    mysql执行权限检查顺序


    开始查询

    1. 校验user表,对于全局权限是ok → 直接执行
    2. 检验DB表,对于某个有特定的数据库有权限 → 执行
    3. 检验tables_priv,对于特定数据库下的某些表是有权限 → 执行
    4. 检验columns_priv,对于特定表中的某些列有权限 → 执行

    权限分布

    可能的设置的权限

    表权限

    'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'

    列权限

    'Select', 'Insert', 'Update', 'References'

    过程权限

    'Execute', 'Alter Routine', 'Grant'

     

     

     

     

     

    用户登录,user表首先能限制用户登录,其次还保存了该用户的全局权限,如果该用户没有任何权限,那么将从db表中查找该用户是否有某个数据库的操作权限,如果都没有,将从table_priv表中查找该用户是否有某个表的操作权限,如果有,则该用户可以按照已有的权限来操作该表。


    实际操作

    在我们安装完数据库后,只能在本地登录数据库,当进行远程登录时,会提示我们错误。

    æä¹è§£å³mysqlä¸å许è¿ç¨è¿æ¥çé误

    1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server

    这时,我们就要进行相应的配置,给特定的用户赋予特定的操作权限。

    MySQL中使用GRANT命令和REVOKE命令来管理用户的权限。

     

    创建/授权用户:


    有两种方式创建MySQL授权用户

    方法一、通过insert语句直接操作MySQL系统权限表(此处不再赘述)

    方法二、执行create user/grant命令(推荐)

    注意:

    • 在试用grant命令创建用户时要注意了,在MySQL5.7.7版本前,如果被授权的用户不存在,那么grant语句会自动创建新的账户,除非设置参数sql_mode 包含 “NO_AUTO_CREATE_USER” 。
    • 但从5.7.7版本开始,默认的sql_mode就包含“NO_AUTO_CREATE_USER” (grant语句不再创建新的账户
    • 因此,如果你是用的MySQL版本较新,要注意语法了,需要先用create user创建用户,再用grant命令赋权限;


    一、创建用户格式

    创建用户命令一般格式:

    create user [用户名]@[访问地址] identified by [密码]


    举例1:创建zhangsan用户,只是创建用户并没有权限,'localhost'表示只能在本地登录,无法通过远程连接;密码是 password

    CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'password';

    举例2:创建lisi用户,只是创建用户并没有权限,密码为 password,%通配符表示任何主机都可以连接(可以远程连接),

    CREATE USER 'lisi'@'%' IDENTIFIED BY 'password';

    举例3:(5.7.7版本前)的创建用户并赋予RELOAD,PROCESS权限 ,在所有的库和表上;*.*:代表所有的库表

    GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost' identified by '123456';

    二、授权格式及示例:

    grant [权限1,权限2,权限3] on *.* to user@'host' identified by 'password'

    常用权限:all privileges、create、drop、select、insert、delete、update

    例如,给"zhangsan" 用户管理员权限,并且允许该用户继续给别的用户赋权限

    grant all privileges on *.* to 'zhangsan'@'192.168.1.%' with grant option;
    • all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
    • on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
    • to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:'zhangsan'@'192.168.1.%',表示zhangsan这个用户只能在192.168.0.* IP段登录
    • with grant option:通过在grant语句的最后使用该子句,就允许被授权的用户把得到的权限继续授给其它用户

    注:使用GRANT添加权限,权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个SELECT权限,后来又给用户添加了一个UPDATE权限,那么该用户就同时拥有了SELECT和UPDATE权限。
     

    1. 授予管理员权限

    举例4:把zhangsan 变成管理员用户,拥有root权限

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'zhangsan'@'localhost' WITH GRANT OPTION;
    #刷新权限命令
    mysql> flush privileges;

    2. 授予数据库、表权限

    举例5:授予用户zhangsan可以对test数据库中的所有表进行查询

    grant select on test.* to zhangsan;


    举例6:授予lisi在test数据库中创建、修改、删除表的权限以及创建视图的权限

    grant create、alter、drop、create view on test.* to lisi;


    举例7:授予lisi可以对当前数据库中的所有表进行查询, * :表示当前数据库

    grant select on * to lisi; 


    举例8:授予lisi可以创建、修改、删除数据库以及对所有数据库中的所有表进行create、alter和drop

    grant create,alter,drop on . to lisi;


    举例9:授予lisi可以创建新用户

    grant create user on . to lisi;

    3. 授予列权限


    # 例10:给zhangsan用户赋权限,设置为在test库,shop表,上的id、name、price列只有select 权限

    mysql> grant select(id,name,price) on test.temp to zhangsan@'localhost' WITH GRANT OPTION;
    #刷新权限
    mysql> flush privileges;

    # 举例11:授予用户zhangsan可以对test.shop表的id和name列进行更新

    grant update(id,name) on test.shop to zhangsan@'localhost';


    # 举例12:查看自己的权限:

    show grants;

     

    三、修改用户配置:

    1. 回收 mysql 权限


    通过 revoke 命令收回用户权限,回收的时候看一下这个用户有哪些权限然后回收 

    show grants for admin@'localhost';
    mysql> show grants \G
    *************************** 1. row ***************************
    Grants for admin@localhost: GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION
    1 row in set (0.00 sec)
    


    revoke :回收权限

    mysql> revoke PROCESS ON *.* FROM admin@'localhost';
    #刷新权限
    mysql> flush privileges;

    2. 删除 mysql 用户

    drop user admin@'localhost';

    3. 修改 mysql 用户密码

    修改用户密码的方式包括以下三种:

    -- 第一种
    ALTER USER 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';
    -- 第二种
    SET PASSWORD FOR 'chenhh'@'localhost' = PASSWORD('mypassword');
    -- 第三种
    GRANT USAGE ON *.* TO 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';


    如在数据库外命令行中,通过:mysqladmin -u用户名 -p旧的密码 password 新密码

    shell> mysqladmin -u user_name -h host_name password "new_password"

     

    # 修改当前会话本身用户密码的方式包括:

    -- 第一种
    ALTER USER USER() IDENTIFIED BY 'mypassword';
    -- 第二种
    SET PASSWORD = PASSWORD('mypassword');

    4. 忘记密码

    1> 添加登录跳过权限检查配置

    修改my.cnf,在mysqld配置节点添加skip-grant-tables配置

    [mysqld]
    skip-grant-tables

    2> 重新启动mysql服务

    shell> service mysqld restart

    3> 修改密码

    -- 第一种
    ALTER USER 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';
    -- 第二种
    SET PASSWORD FOR 'chenhh'@'localhost' = PASSWORD('mypassword');
    -- 第三种
    GRANT USAGE ON *.* TO 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';

    5. 设置MySQL用户密码过期策略

    设置系统参数default_password_lifetime作用于所有的用户账户,修改my.cnf系统文件重启MySQL即可

    [mysqld]
    default_password_lifetime=90
    
    #default_password_lifetime=180 设置180天过期
    
    #default_password_lifetime=0 设置密码不过期 

    如果为每个用户设置了密码过期策略,则会覆盖上述系统参数,设置方式如下:

    -- 90天过期
    ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; 
    -- 密码不过期
    ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE NEVER; 
    -- 默认过期策略
    ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE DEFAULT; 

    手动强制某个用户密码过期

    ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE;

    6. mysql 用户 lock

    通过执行create user/alter user命令中带account lock/unlock子句设置用户的lock状态

    Create user语句默认的用户是unlock状态

    创建的时候给用户锁定方式

    create user chenhh@localhost identified by 'mysql' account lock;

    Alter user语句默认不会修改用户的lock/unlock状态

    # 修改用户为unlock

     alter user chenhh@'localhost' account unlock;

    当客户端使用lock状态的用户登录MySQL时,会收到如此报错 

    Access denied for user ‘user_name’@’host_name’. 
    Account is locked.

    7. 用户重命名

    rename user 'chenhh'@'%' to 'zhoujielun'@'%';

     

     

    展开全文
  • MySQL查看用户权限权限管理

    万次阅读 2021-05-21 17:56:22
    一、 MySQL权限级别介绍 全局——可以管理整个MySQL 库——可以管理指定的数据库 ...二、查看用户权限 1、查看所有用户(用户名、给谁授权) SELECT user,host FROM mysql.user; 2、查看单个用户所有情况 SELECT
  • mysql数据库用户及用户权限管理

    万次阅读 多人点赞 2018-10-09 21:37:06
    (1)mysql数据库用户权限级别  1)全局性管理权限:作用于整个mysql实例级别  2)数据库级别:作用于指定的某个数据库上或者所有数据库上  3)数据库对象级别权限:作用于指定的数据库对象上(表或者视图) ...
  • 账户权限管理 首先进入Mysql控制台: mysql -uroot -p grant授权格式:grant 权限列表 on 库.表 to 'user_name'@'host name' identified by "密码"; user_name是用户名,host_name为主机名,即用户连接Mysql时...
  • mysql授权用户权限

    千次阅读 2021-01-20 19:22:59
    grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user@’%’grant insert on testdb.* to common_user@’%’grant update on testdb.* to common_user@...
  • MySQL用户权限总结【用户授权必会】

    千次阅读 2021-11-27 21:54:31
    文章目录一、MySQL用户权限二、用户权限介绍1.权限级别2.权限实现3.权限分布4.查询权限表三、用户权限实战1.查看用户权限信息2.用户创建和授权创建MySQL用户和权限*刷新权限查看和修改权限 参看: 《MySQL必知必...
  • mysql创建用户和管理用户权限

    千次阅读 2021-01-19 03:21:50
    一、创建用户mysql>create user 'username'@'host' identified by 'password';username 创建的用户名host 指定该用户在哪个主机上可以登录,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机...
  • 教您如何查看MySQL用户权限

    千次阅读 2021-01-18 23:09:40
    教您如何查看MySQL用户权限如果需要查看MySQL用户权限,应该如何实现呢?下面就为您介绍查看MySQL用户权限的方法,并对授予MySQL用户权限的语句进行介绍,供您参考。查看MySQL用户权限:show grants for 你的用户...
  • mysql数据库权限管理

    千次阅读 2021-02-02 11:42:57
    mysql数据库权限管理# 查看权限# 使用mysql数据库mysql> use mysql;# 查看所有用户和权限# 查询主机用户名密码:5.7版本之前的mysql> select host,user,plugin,password from user;# 查询主机用户名密码:5.7...
  • 文章目录用户权限管理1.可视化管理方式2.原生SQL命令方式(1)创建用户(2)修改密码(3)用户重命名(4)用户授权(5)查看权限(6)撤销权限 用户权限管理 1.可视化管理方式 利用像 SQL yog 这样的可视化软件——...
  • Mysql用户权限操作

    千次阅读 多人点赞 2020-09-23 17:38:22
    服务器中名为mysqI的数据库,用于维护数据库的用户以及权限的控制和管理MySQL中的所有用户信息都保存在mysql.user数据表中。 根据mysql.user表字段的功能可将其分为6类 客户端访问服务器的账号字段 Host和User...
  • MySQL用户权限管理

    千次阅读 2019-03-28 12:51:58
    05.废除用户权限 mysql认证方式: root(用户名)@localhost(登录主机的地址–客户端) 密码 客户端: 要通过什么用户通过什么密码登录服务器 我们要关注:用户名 密码 要登录的服务器的ip地址 服务器提供的mysql服务的...
  • MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。 grant select on testdb.* to common_user@'%' grant ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 243,669
精华内容 97,467
关键字:

mysql用户权限管理

mysql 订阅