zoukankan      html  css  js  c++  java
  • MySQL 8.0中为什么通过角色授予的权限使用不了?————角色激活

    角色是权限的集合,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程,从而大大提高了开发效率。

    然而在实际实践中,居然有一个大坑!————角色没有被激活

    这坑有点深,只可惜坑天生就是可以被填的!

    下面来复述一下我的踩坑过程。

    先创建一个角色

    create role R1;

    进入一个数据库中,为角色授予权限

    use test;
    # 将对student表的所有操作权限都赋予给角色R1 grant all on student to R1;

      

    创建一个新用户

    # 新用户名字为U1, 登录密码为123456
    create user U1@'localhost' identified by '123456';

      

    将角色R1所拥有的权限授予给用户U1

    grant R1 to U1@'localhost';
    

      

    查看此时用户U1所拥有的权限

    show grants for U1@'localhost';
    # 如果还想知道用户通过角色拥有哪些权限,可以在结尾加个using role,即:
    show grants for U1@'localhost' using R1;

    会有如下显示:

    # USAGE表示无权限
    GRANT USAGE ON *.* TO `U1`@`localhost`
    # 刚刚通过角色R1授予的权限 GRANT `R1`@`%` TO `U1`@`localhost`

      

    既然如此,不就大功告成了!换用户U1登录验证一下

    exit
    # 密码为123456 mysql -u U1 -p

    此时用户U1应该可以对test数据库中student表进行操作,那就使用test数据库查看一下

    use test;

    出现了如下错误:

    ERROR 1044 (42000): Access denied for user 'U1'@'localhost' to database 'test'
    

    什么鬼,反复检查上述过程,肯定是没错的,那是什么问题啊啊啊啊啊啊。。。

    原来是角色没有被激活!

    原来是角色没有被激活!

    原来是角色没有被激活!

    查看角色激活情况

    SELECT CURRENT_ROLE();
    

      

    激活角色有两种方法:

      1、非永久激活:

    # 第一种方式
    set default role all to U1@'localhost'; # 第二种方式
    set default R1 to U1@'localhost';
    # 注意若此时立即再使用命令select current_role();还是会显示没有角色被激活。
    # 我们应该先退出,换用户U1登录再查看
    exit
    mysql -u U1 -p
    select current_role();
    # 现在可以看到角色R1已经被激活了
    show databases;
    use test;
    show tables;
    select * from student;

      2、永久激活:(用户连接到服务器时自动激活所有显式授权和强制角色)

        注:默认情况下,禁用自动角色激活。

    SET global activate_all_roles_on_login=ON;

      

  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    问题清单
    2020软件工程个人作业06
    2020软件工程作业05
    2020软件工程作业00
    2020软件工程作业04
    2020软件工程作业03
  • 原文地址:https://www.cnblogs.com/ReturnOfTheKing/p/13377330.html
Copyright © 2011-2022 走看看