MySQL深刻研究:用戶管理

俗世遊子:專一技術研究的程序猿html

說在前面的話

安裝完成以後,默認狀況下會有一個帳戶:root,該帳戶擁有數據庫最高權限,若是咱們下發root帳戶作開發帳號,很容易出現誤刪系統庫的問題,因此咱們最好可以新建帳戶,授予須要的權限就好mysql

下面咱們來看看該如何操做web

操做MySQL

當前MySQL環境: 8.0.23sql

鏈接到MySQL

再回顧一下,上節聊到經過命令行鏈接到MySQL的命令:shell

mysql -uroot -p

-u表示要跟上用戶名,-p表示密碼,其實能夠寫成這樣:數據庫

mysql -uroot -p123456

這種方式只適合用於簡單的密碼,若是一些密碼中存在特殊字符,那麼就不行了服務器

固然,咱們還能夠鏈接到遠程服務器,經過-h來操做:app

mysql -h127.0.0.1 -uroot -p

鏈接本地MySQL的話,能夠省略-hwebapp

進入到MySQL

鏈接進來以後,咱們能夠經過如下方式查看有多少數據庫:ide

show databases;

image-20210402070304271

MySQL剛剛安裝,包含這5個庫,其中:

  • information_schema:其中存儲整個數據庫中的全部結構和信息,包含表結構,字段等信息
  • mysql:存儲數據庫中用戶,角色等等的信息
  • sys:其中只有一張表,存儲的是系統配置信息
  • performance_schema:存儲MySQL監控信息,若是SQL執行時間,CPU佔用率,線程數等等不少的信息,若是咱們想作一個MySQL監控工具,這個庫中的表很關鍵

  • test:這個庫就是一個測試庫,咱們通常操做都是在這裏或者是新建庫

若是咱們想要進入到某一個庫,經過use來進入

use test;

這樣就進入到了test庫中

若是不想用test,想本身建立的話,那麼經過help create database能夠查看詳細的說明

create database test1;

用戶管理

角色:create role

這裏須要注意一點,角色這一特性在MySQL 8.x之下的版本是不存在的

CREATE ROLE [IF NOT EXISTS] role [, role ] ...

建立角色的方式很是簡單,經過這一sql就能夠建立完成,同時建立角色的同時也能夠指定其Host方式,好比:

CREATE ROLE 'administrator', 'developer';
CREATE ROLE 'webapp'@'localhost';

那麼,建立好的角色咱們應該在哪裏查看?進入到mysql庫,經過show tables能夠查看全部的表。事實上,建立好的角色保存在了user表中,是否是很奇怪

select Host,User,plugin from user;

image-20210402071930822

能夠看到,咱們新建的3個角色

用戶:create user

成功進入到MySQL以後,咱們就開始建立用戶吧。

記住,想要新建用戶,必須擁有特定的權限,否則是沒法新建用戶的:

  • CREATE USER的權限
  • mysql庫中user表的INSERT權限
help create user;

create user新建用戶的格式很長,咱們只看咱們經常使用的,其餘的你們本身嘗試

下面咱們經過實際語句來操做一下:

建立用戶並設置密碼

CREATE USER 'test1'@'%' IDENTIFIED BY 'ASDFghjk123!@#';

%表示爲鏈接主機名,表示任意客戶端均可以正常鏈接,若是設置爲localhost,那麼只有本地能夠鏈接,當前能夠設置爲IP等,

image-20210331073333705

能夠發現是能夠正常進入的,只有一個庫,並且沒有任何權限

權限後面說,建立用戶的過程尚未完

建立好的用戶會存儲在mysql/user表中,咱們只須要進入到這種表查看:

use mysql
select Host,User,plugin from user;

image-20210402072444010

因此說,MySQL8.x的版本默認建立的身份驗證方式是:caching_sha2_password,下面咱們指定一下驗證方式的方式來建立

caching_sha2_password這種方式一些遠程客戶端是沒法驗證經過的,須要指定到以前的驗證方式

建立用戶並指定身份驗證

CREATE USER
  'test2'@'localhost' IDENTIFIED WITH mysql_native_password
                                   BY 'ASDFghjk123!@#';

image-20210402072556689

建立用戶並指定角色

前面提到,單純的建立用戶沒有任何操做權限,因此咱們在建立的時候經過指定角色的方式來讓用戶擁有權限

CREATE USER 'test3'@'%' IDENTIFIED WITH mysql_native_password BY 'ASDFghjk123!@#' DEFAULT ROLE administrator, developer;

這裏在指定角色的時候,角色必須是要存在的,否則會報錯

image-20210402073046526

其中關係對應存在存儲在default_roles

image-20210402073129064

這裏想象成RBAC形式的受權方式,用戶只須要受權角色,當前用戶就能夠擁有該角色下的全部資源

image-20210403102530429

修改:alter user

若是咱們用戶已是存在的,好比:root用戶,咱們須要對該用戶進行調整,咱們只能經過alter user來調整了

help alter user;

一樣,經過help來查看當前如何使用,這裏就不貼圖了,下面具體看實例

查看當前用戶

若是咱們想要查看咱們當前登陸的用戶,能夠經過如下方式

select CURRENT_USER();

image-20210403103941007

修改指定用戶密碼和身份驗證

ALTER USER 'test2'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'ZXCvbn457$%^';

記住,若是咱們在修改一個沒有的用戶,那麼就會報錯,也就是說這裏是關鍵:'test2'@'localhost'

上一節裏面爲了可以讓root用戶遠程鏈接,咱們是用過這個命令的

修改指定用戶的角色

一樣的,若是須要修改用戶的受權角色的話,那麼咱們也能夠經過這種方式來進行操做

ALTER USER 'test3'@'%' DEFAULT ROLE administrator;

這樣咱們經過select * from default_roles就能夠查詢到最終受權

修改完以後,須要刷新一下資源才能生效

FLUSH PRIVILEGES;

資源受權

相信你們也發現了,咱們如今只是建立好了角色和用戶,可是沒法進行任何操做,因此咱們接下來就對這些進行受權,讓咱們能夠經過咱們新建的用戶進行正常操做

受權語句採用GRANT來進行操做,咱們經過help來查看具體的使用方式:

help grant

經過help其實咱們能夠看到,官方除了給出了和具體的介紹,還給出了實際案例

image-20210403192406155

咱們不作程序,咱們只是程序的搬運工

單用戶受權

先來看個簡單的操做:

grant all on *.* to 'test2'@'localhost';

執行完最好刷新一下資源flush privileges;

若是咱們經過test2這個用戶就能夠執行正常操做了

下面咱們就來解釋下各個含義:

  • all:表示操做,是指SELECT,UPDATE,INSERT,DELETE等不少不少的權限

具體權限信息請查看:MySQL支持的權限

  • *.*:前一個表示庫名,後一個表示表名*表示所有,能夠操做所有的庫包括系統庫。若是想要操做某一個庫或者某個庫下的某一張表,那麼就能夠經過具體名稱指定的方式來限制
grant all on test.user to 'test2'@'localhost';

若是咱們是想給表中的某個字段授予權限,那麼授予的每一個權限都必須跟上列名

grant select(id), insert(login_name, login_pwd) on test.user to 'test2'@'localhost';

若是咱們想經過表來查看具體的受權信息,那麼咱們須要關注mysql庫中關於*_priv的表,好比:

create user 'test1'@'%' identified with mysql_native_password by 'ASDfghjkl456^&*';
grant update on test.user to 'test1'@'%';
flush privileges;

對應的關係就存儲在這裏了

image-20210404092116955

並且對應的效果也在這裏,能夠很明顯的看出來

image-20210404092304226

關於用戶的受權方式就到這裏了,你們能夠本身嘗試一下

角色受權

除了用戶,角色的受權方式也很是重要,這樣同一組受權資源經過角色受權就很是方便了

首先,咱們先來看如何將角色受權給用戶

GRANT 'role1', 'role2' TO 'test3'@'%';

須要注意的是,這裏角色和用戶都是必需要存在的,還記得建立角色和用戶的語句麼?

create role role1, role2;
create user 'test3'@'%' identified with mysql_native_password by 'ASDfghjkl456^&*';

接下來咱們經過grant給角色受權,其實和給用戶受權是同樣的方式

grant select on test.user to 'role1';
grant delete on test.user to 'role2';

如今將角色受權給用戶

GRANT 'role1', 'role2' TO 'test3'@'%';

和直接受權用戶不一樣的一點在於:

  • 在賬戶會話中,授予用戶賬戶的角色能夠是活動的,也能夠是不活動的。若是授予的角色在會話中處於活動狀態,則其權限適用;不然,他們相反

若是咱們查看當前角色是否活動狀態,那麼經過SELECT CURRENT_ROLE();來查看

出現NONE說明是不活動的狀態,咱們須要激活角色

SET DEFAULT ROLE role1, role2 TO 'test3'@'%'
SET DEFAULT ROLE ALL TO 'test3'@'%'

若是想要激活全部權限的話,那麼就經過all來設置

這樣就正常了,具體表現就不貼圖了,你們本身嘗試下

最後的話

關於其餘更多的操做,經過查看MySQL官網來看,下面給出具體網址:
MySQL帳戶設置

相關文章
相關標籤/搜索