zoukankan      html  css  js  c++  java
  • 08--用户,权限管理

    一 mysql库下的授权表

    linux系统的用户作用是:

    • 1、登陆系统
    • 2、管理系统文件

    一样的道理,mysql数据库管理软件用户的则作用是:

    • 1、登陆MySQL数据库
    • 2、管理库与表等数据库对象

    mysql数据库管理软件将权限信息都存放于mysql库下,该库下有一系列授权表,权限信息都存放于这一系列表中,我们挑几个重点介绍一下

    mysql库下的授权表及其放行权限的范围

    • 1、mysql.user

      针对所有数据、所有库下所有表、以及表下的所有字段

    • 2、msyql.db

      只针对某一数据库下的所有表,以及表下的所有字段

    • 3、tables_priv

      只针对某一张表、以及该表下的所有字段

    • 4、columns_priv

      只针对某一个字段

    例如:权限表放行权限的范围

    mysql.user:针对库db1,db2及其包含的所有
    db:只针对库例如db1,及其db1包含的所有
    tables_priv:只针对db1.table1,及其该表包含的所有
    columns_prive:只针对db1.table1.column1,只放行该字段
    

    二 权限相关操作

    1 .创建查询删除用户

    创建用户语法

    create user '用户名'@'主机' identified by '密码';
    

    create user 'dan'@'1.1.1.1' identified by '123';
    create user 'dan'@'192.168.1.%' identified by '123';
    create user 'dan'@'%' identified by '123';
    

    查询用户

    mysql> select user,host from mysql.user;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | root | 127.0.0.1 |
    | root | ::1       |
    |      | db04      |
    | root | db04      |
    |      | localhost |
    | root | localhost |
    +------+-----------+
    mysql> select * from mysql.userG;      #以行显示
    

    删除用户

    mysql> drop user name@'%';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> drop user ''@db04;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> drop user 'root'@db04;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> drop user ''@localhost;
    Query OK, 0 rows affected (0.00 sec)
    

    修改密码

    # 方式1
    mysqladmin -uroot -p123 password '1'
    
    # 方式2
    update mysql.user set password=password('123') where user='root' and host='localhost';
    
    # 方式3
    set password=password('1');   修改当前用户的密码
    
    # 方式4
    grant all on *.* to 'root'@'localhost' identified by '123';
    
    1. )授权

    MySQL 赋予用户权限命令的简单格式可概括为:

    grant 权限 on 数据库对象 to 用户
    

    注意:grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。

    查看帮助

    mysql> help grant
    

    权限:对文件夹,对文件,对文件某一字段的权限

    常用权限有:select, insert, update, delete
    all可以代表除了grant之外的所有权限

    MySQL 的 权限,分别可以作用在多个层次上

    • 1、所有库的所有表

    • 2、单库下的所有表(最常用的授权级别)

    • 3、单表下的所有列

    • 4、单列权限:企业业里称单列授权为 脱敏,即脱离敏感信息,涉及到敏感信息一定要脱敏

      例如授予vip账号对某一表下所有列的查询权限而授予非vip账号对某一表下的某一列的查询权限
      
    • 5、针对存储过程的权限

    • 6、针对函数的权限

    举例如下

    #(1)针对所有库的所有表:*.* 
    grant select on *.* to 'dan1'@'localhost' identified by '123'; 
    只在user表中可以查到dan1用户的select权限被设置为Y
    
    #(2)针对某一数据库:db1.*
    grant select on db1.* to 'dan2'@'%' identified by '123'; 
    只在db表中可以查到egon2用户的select权限被设置为Y
    mysql> grant all on danbiao.dep to 'lili'@'%' identified by '222' #指定某个库下的表授权
    
    #(3)针对某一个表:db1.t1
    grant select on db1.t1 to 'dan3'@'%' identified by '123';  
    只在tables_priv表中可以查到egon3用户的select权限
    
    #(4)针对某一个字段:
    mysql> select * from t3;
    +------+-------+------+
    | id   | name  | age  |
    +------+-------+------+
    |    1 | egon1 |   18 |
    |    2 | egon2 |   19 |
    |    3 | egon3 |   29 |
    +------+-------+------+
    
    grant select (id,name,age),update (id) on db1.t3 to 'egon4'@'localhost' identified by '123'; 
    #可以在tables_priv和columns_priv中看到相应的权限
    mysql> select * from tables_priv where user='egon4'G
    *************************** 1. row ***************************
           Host: localhost
             Db: db1
           User: egon4
     Table_name: t3
        Grantor: root@localhost
      Timestamp: 0000-00-00 00:00:00
     Table_priv:
    Column_priv: Select,Update  # 针对字段授权
    row in set (0.00 sec)
    
    mysql> update t3 set id=333 where id=3; # 因为给了id字段修改权限,所以被授权用户可以修改此字段
    update t3 set age=88 where id=3; #报错。被授权用户没有 可以修改的权限
    
    mysql> select * from columns_priv where user='egon4'G
    *************************** 1. row ***************************
           Host: localhost
             Db: db1
           User: egon4
     Table_name: t3
    Column_name: id
      Timestamp: 0000-00-00 00:00:00
    Column_priv: Select
    *************************** 2. row ***************************
           Host: localhost
             Db: db1
           User: egon4
     Table_name: t3
    Column_name: name
      Timestamp: 0000-00-00 00:00:00
    Column_priv: Select
    
    #(5)作用在存储过程上:
    use db1;
    
    delimiter //
    create procedure p1()
    BEGIN
        select * from blog;
        INSERT into blog(name,sub_time) values("xxx",now());
    END //
    delimiter ;
    
    show procedure status; -- 查看到db1下有一个名为p1的存储过程 
    
    grant execute on procedure db1.p1 to 'dba'@'localhost';
     procedure #存储过程
    
    #(6)作用在函数上:
    delimiter //
    create function f1(
        i1 int,
        i2 int)
    returns int
    BEGIN
        declare num int;
        set num = i1 + i2;
        return(num);
    END //
    delimiter ;
    
    show function status; -- 查看到db1下有一个名为f1的函数
    
    grant execute on function db1.f1 to 'dba'@'localhost';
    
    测试:
    [root@localhost ~]# mysql -udba -p
    mysql> select db1.f1(1,2);
    

    all可以代表除了grant之外的所有权限,可以用with带上grant,授权一个超级管理员

    grant all on *.* to hehe@'%' identified by '123' with grant option;查看mysql.user表中可以查到hehe用户的grant权限也被设置为Y
    

    3 )查看授权

    #1.授权:mysql> grant all on *.* to root@'%' identified by '123';#2.查看用户权限查看当前用户(自己)权限:mysql> show grants;查看其他 MySQL 用户权限:mysql> show grants for longlong@'%';
    

    4)撤销权限(回收权限)

    revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

    grant  all on *.* to   dba@localhost;mysql> revoke all on *.* from longlong@'%';Query OK, 0 rows affected (0.00 sec)revoke select on db1.* from 'lili'@'%';
    

    5 )扩展授权

    max_queries_per_hour:一个用户每小时可发出的查询数量
    max_updates_per_hour:一个用户每小时可发出的更新数量
    max_connections_per_hour:一个用户每小时可连接到服务器的次数
    max_user_connections:允许同时连接几台机器的数量
    
    mysql> grant all on *.* to test@'%' identified by '123' with max_user_connections 1;
    
    # 测试:
    mysql -utest -p123 -h192.168.15.100
    
    不要用-hlocalhost,它代表通过本地套接字链接
    

    2. 针对不同角色权限分配

    1 )针对普通用户

    grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

    grant select on testdb.* to common_user@'%'grant insert on testdb.* to common_user@'%'grant update on testdb.* to common_user@'%'grant delete on testdb.* to common_user@'%'
    

    或者,用一条 MySQL 命令来替代:

    grant select, insert, update, delete on testdb.* to common_user@'%'
    

    2) 针对开发人员

    grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限,具体操作如下

    -1、grant 创建、修改、删除 MySQL 数据表结构权限。

    grant create on testdb.* to developer@'192.168.0.%';grant alter  on testdb.* to developer@'192.168.0.%';grant drop   on testdb.* to developer@'192.168.0.%';
    

    -2、grant 操作 MySQL 外键权限。

    grant references on testdb.* to developer@'192.168.0.%';
    

    -3、grant 操作 MySQL 临时表权限。

    grant create temporary tables on testdb.* to developer@'192.168.0.%';
    

    -4、grant 操作 MySQL 索引权限。

    grant index on testdb.* to developer@'192.168.0.%';
    

    -5、grant 操作 MySQL 视图、查看视图源代码 权限。

    grant create view on testdb.* to developer@'192.168.0.%';grant show view on testdb.* to developer@'192.168.0.%';
    

    -6、grant 操作 MySQL 存储过程、函数 权限。

    grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
    
    grant alter  routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
    
    grant execute        on testdb.* to developer@'192.168.0.%';
    

    3) 针对普通DBA

    grant 普通 DBA 管理某个 MySQL 数据库的权限。

    grant all privileges on testdb.* to dba@'localhost'
    

    其中,关键字 “privileges” 可以省略。

    4) 针对高级DBA

    grant 高级 DBA 管理 MySQL 中所有数据库的权限。

    grant all on *.* to dba@'localhost'
    

    5) 在企业中权限的设定

    #开发人员说:请给我开一个用户
    
    #1.首先进行沟通
    	1.你需要对哪些库、表进行操作
    	2.你从哪里连接过来,如‘10.0.0.%’,权限越小约好
    	3.用户名有没有要求
    	4.密码要求
    	5.你要使用多长时间
    	6.发邮件
    
    #2.一般给开发创建用户权限,建议不给delete权限
    grant select,update,delete,insert on *.* to dan@'10.0.0.%'' identified by '123';
    
    #3.注意:
    开发图方便想要root用户,这玩意,谁给谁背锅,自己斟酌,可以考虑让部门老大来给
    

    三、 破解密码

    1. linux平台

    方法一:不推荐

    [root@egon ~]# rm -rf /var/lib/mysql/mysql  # 所有授权信息全部丢失!!![root@egon ~]# systemctl restart mariadb [root@egon ~]# mysql
    

    方法二:启动时,跳过授权库

    [root@egon ~]# vim /etc/my.cnf    #mysql主配置文件
    [mysqld]
    skip-grant-table
    
    [root@egon ~]# systemctl restart mariadb
    
    [root@egon ~]# mysql
    MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
    MariaDB [(none)]> flush privileges;
    MariaDB [(none)]> q
    
    [root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
    [root@egon ~]# systemctl restart mariadb
    [root@egon ~]# mysql -u root -p123  # 以新密码登录
    

    方法三:**

    #1.先关闭数据库服务
    方式1 :systemctl stop mysql
    方式2: mysqladmin -uroot -p222 -S /tmp/mysql.sock shutdown
    
    #2.跳过授权表启动mysql
    mysqld_safe --skip-grant-tables --skip-networking &
    
    ps:还需要跳过网络,否则在操作过程中很不安全
    
    #3.登录并修改密码
    [root@db02 ~]# mysql
    mysql> update mysql.user set password=password('111') where user='root' and host="localhost";
    mysql> flush privileges;
    mysql> q
    
    #用修改后的密码登录即可
    [root@db02 ~]# mysql -uroot -p111
    

    2. windows平台下

    5.7版本mysql
    方式一

    #1 关闭mysql
    #2 在cmd中执行:mysqld --skip-grant-tables
    #3 在cmd中执行:mysql
    #4 执行如下sql:
    update mysql.user set authentication_string=password('') where user = 'root';
    flush privileges;
    
    #5 tskill mysqld #或taskkill -f /PID 7832
    #6 重新启动mysql
    

    方式二

    #1. 关闭mysql,可以用tskill mysqld将其杀死
    #2. 在解压目录下,新建mysql配置文件my.ini
    #3. my.ini内容,指定
    [mysqld]
    skip-grant-tables
    
    #4.启动mysqld
    #5.在cmd里直接输入mysql登录,然后操作
    update mysql.user set authentication_string=password('') where user='root and host='localhost';
    
    flush privileges;
    
    #6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了
    
  • 相关阅读:
    linux获取日志指定行数范围内的内容
    python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题
    robot framework添加库注意事项
    robot framework取出列表子元素
    Vue 及框架响应式系统原理
    响应式布局和自适应布局的不同
    前端综合学习笔记---异步、ES6/7、Module、Promise同步 vs 异步
    前端综合学习笔记---变量类型、原型链、作用域和闭包
    doT.js模板引擎及基础原理
    Spring Boot入门第五天:使用JSP
  • 原文地址:https://www.cnblogs.com/caodan01/p/15005899.html
Copyright © 2011-2022 走看看