十、MySQL用户授权

用户授权

  • 什么是用户授权

    在数据库服务器上添加新的连接用户,在添加用户时可以设置访问权限以及连接密码
    默认数据库管理员root用户本机登录有授权权限
    
  • 授权命令格式

    grant 权限列表 on 库名 to 用户名@"客户端地址" 
        identified by "密码" 		# 授权用户密码
        [with grant option];	 # 收授权权限,可选项 (新添加用户访问数据库时,也可以给其他用户授权)
    
    # 权限列表
      all 		# 所有权限
      usage		# 无权限
      select,update,insert		# 个别权限
      select,update(字段1,..,字段N)		# 指定权限
    # 库名
      - "*.*"				# 所有库和所有表
      - "库名.*"			# 一个库
      - "库名.表名"			# 一张表
    # 用户名
      - 授权时自定义 要有标识性
      - 存储在mysql库的user表里
    # 客户端地址
      - '%'				# 所有主机
      - '192.168.4.%'	# 网段内所有主机
      - '192.168.4.8'	# 1台主机
      - 'localhost'		# 数据库服务器本机
    
  • 授权例子

    grant all on db2.* to yaya@"%" identified by "123456";
    
    应用示例:
      - 添加用户mydba,对所有库、表有完全权限
      - 允许从任何客户端连接,密码123qqq..A
      - 且有授权权限
    grant all on *.* to mydba@"%" identified by "123qqq..A" with grant option;
    # 完成后使用其他客户机使用mydba登录验证权限(建库建表,删库删表,增删改查,授权用户)
    
    # information_schema 这是一个虚拟库,内存的映射,所有用户都没有操作权限
    
    应用示例:
      - 添加admin用户,允许从192.168.4.0/24网段连接,对db2库的user表有查询权限,密码123456
    grant select on db2.user to admin@"192.168.4.%" identified by "123456";
    
    应用示例:
      - 添加admin2用户,允许从本机连接,允许对db2库的所有表有查询/更新/插入/删除记录权限,密码123456
    grant select,update,insert,delete on db2.* to admin2@"localhost" identified by "123456";
    
    mysql> grant select,update on db2.user to nayue@"%" identified by "123456";
    mysql> grant select,update(password,shell),insert on db2.user to catdexin@"%" identified by "123456";
    

相关命令

  • 登录用户使用

    命令 作用
    select user() 显示登录用户名以及客户端地址
    show grants 用户显示自身访问权限
    show grants for 用户名@"客户端地址" 管理员查看已有授权用户权限
    set password=password("密码") 授权用户连接后修改密码
    set password for 用户名@"客户端地址=password("密码") 管理员重置授权用户连接密码
    drop user 用户名@"客户端地址" 删除授权用户(必须有管理员权限)
    mysql> show grants;
    
    # 管理员账号操作
    mysql> show grants for admin2@"192.168.4.%";
    mysql> show grants for admin2@"localhost";
    
    mysql> set password for yaya@"%"=password("123456");	# 修改yaya的登录密码
    
    mysql> drop user admin2@"localhost";
    
    # 扩展: 关于password
    password("密码") # 本身是个加密函数 可以使用select password("密码") 查看加密结果
    

授权库mysql(记录授权信息MySQL库的管理)

  • mysql库记录授权信息,主要表如下

    user				# 记录已有的授权用户及权限
    db					# 记录已有授权用户对数据库的访问权限
    tables_priv			# 记录已有授权用户对表的访问权限
    columns_priv		# 记录已有授权用户对字段的访问权限
    
    可以通过表记录,查看到授权用户的权限信息,也可以通过修改记录,来改用户的权限
    
    mysql> desc mysql.user;
    mysql> select * from mysql.user where user="yaya" \G;
    
    # 查看授权库表的结构
    mysql> desc mysql.db;
    
    # 查看用户对库的权限
    mysql> select User,Host,Db from mysql.db;
    mysql> select * from mysql.db where Host="%" and db="db2" \G;
    
    # 修改用户对库的权限
    mysql> update mysql.db set Insert_priv="N",Delete_priv="N" where User="yaya";
    
    # 刷新权限
    mysql> flush privileges;
    
    # 查看权限信息
    mysql> show grants for yaya@"%";
    
    mysql> desc tables_priv;
    
    mysql> select * from mysql.tables_priv;
    mysql> select * from mysql.tables_priv where Db="db2" and Table_name="user";
    
    mysql> update mysql.tables_priv set Table_priv="Select,Insert,Update,Delete" where User="admin";
    
    mysql> flush privileges;
    mysql> show grants for admin@"192.168.4.%";
    
    mysql> desc columns_priv;
    mysql> select * from columns_priv;
    mysql> show grants for catdexin@"%";
    

撤销授权

  • 删除已有授权用户的权限

    revoke 权限列表 on 库名.表 from 用户名@"客户端地址";
    
    mysql> grant all on *.* to lui@"%" identified by "123456" with grant option;
    mysql> show grants for lui@"%";
    
    mysql> revoke grant option on *.* from lui@"%";	# 撤销授权权限
    
    mysql> revoke delete on *.* from lui@"%";	# 撤销删除权限
    
    mysql> revoke all on *.* from lui@"%";		# 撤销所有权限
    

删除授权用户

  • 删除用户

    drop user 用户名@"客户端地址";
    
    # 撤销权限但是还能登陆,删掉用户彻底禁止
    
    mysql> drop user lui@"%";
    

管理root密码

  • 回复root密码

    root密码忘记怎么办?
      - 使用操作系统管理员账号登陆系统
      - 停止MySQL服务程序
      - 跳过授权表启动MySQL服务程序
      - 修改root密码
      - 以正常方式重启MySQL服务程序
    
  • 恢复密码

    [root@admin ~]# systemctl stop mysqld
    
    [root@admin ~]# vim /etc/my.cnf
    [mysqld]
    skip-grant-tables				# 跳过授权表
    # validate_password_policy=0	# 注释掉密码策略(如果有)
    # validate_password_length=6
    
    [root@admin ~]# systemctl start mysqld
    
    [root@admin ~]# mysql		# 这个时候,没有密码验证,可以直接访问
    
  • 修改密码(重置密码)

    mysql> update mysql.user set authentication_string=password("Yue3314526!") where host="localhost" and user="root";
    
    mysql> flush privileges;
    
  • 将配置文件修改回正常,并重启MySQL

    [root@admin ~]# vim /etc/my.cnf
    
    [root@admin ~]# systemctl restart mysqld
    
    [root@admin ~]# mysql -uroot -p'Yue3314526!'
    
  • 使用命令行修改MySQL密码

    [root@admin ~]# mysqladmin -hlocalhost -p password "123456";
    
    [root@admin ~]# mysql -uroot -p'123456'
    
posted @ 2021-11-16 11:02  CatdeXin  阅读(262)  评论(0)    收藏  举报