Grant MySql- Bài 1: Sơ Lược về MySql và Thiết Lập User Trong MySql

    Hi các bạn. Vài tuần qua mình có bận ghê nhưng cái máu chia sẻ thì vẫn còn nguyên. Tiện thể hôm nay đang tìm hiểu lại golang và mysql lên mình viết 1 serise nho nhỏ khoảng 2-3 bài viết về cách tạo user và phân quyền trong mysql. Ở bài viết đầu tiên này mình sẽ giới thiệu sơ lược lại mysql một cách cơ bản nhất thôi vì có rất nhiều bài viết chi tiết về nó rồi, mình cũng sẽ tập chung hơn vào cách tạo user trong mysql để phục vụ cho bài viêt phân quyền với mysql dựa trên việc tạo các user từ bài viết này. Ok vậy thì mình vào bài viết luôn nhé. Sơ lược tóm tắt của bài viết có thể nhìn như thế này.
  1. Sơ lược qua về MySql
  2. Một số tệp lệnh cơ bản trong MySql
  3. Quản lý user cơ bản trong MySql
  4. Một số công cụ làm việc với MySql
    Tiện thể pr luôn cái bài viết phân quyền với mongodb mà mình viết trước đó cho bác nào cần phân quyền với mongodb nhé a hihi 😁.

1. Sơ lược về MySql

- Để nói về mysql thì không biết nói nhiêu cho hết. Điểm qua vài điểm thì nó là một loại cơ sở dữ liệu có quan hệ phổ biến, tốc độ, ổn định, dễ sử dụng, hỗ trợ replication và quan trọng hơn cả là miễn phí ... Nói nhiều hơn về sự phổ biến của thằng này thì bạn zô search từ khóa "top 10 database languages' để coi sao nhé. Còn chi tiết hơn về nó thì có nhiều bài viết nói về nó rồi, mình có đề cập thì cũng dư thừa mất thôi, bạn nào chuyên sâu thì dáng search tìm hiểu thêm nhé, có cái gì hay, lạ thì nhớ chia sẻ thêm với ae cộng đồng nhé (mình không ngại khi rep inbox riêng với mình đâu 😆)
- Rồi giờ thì để làm việc với mysql thì mặc định là bạn cần cài đặt mysql. Cài như thế nào thì bạn google coi sao nhé hehe. Nói thế chứ mình cũng thương anh em lắm, lên mình cũng có một số chỉ điểm về một số cách cài đặt luôn nhé:
  • Cài đặt qua Xampp, Ampps: Đây đều là các công cụ có tích hợp sẵn mysql và hỗ trợ luôn cả gui quản lý mysql. Tiên công đôi việc có cả mysql có cả gui tool 
  • Cài đặt mysql từ trang chủ: Bản chính chủ là đây, tuy nhiên cài đặt xong thì bạn phải thao tác với nó hầu hết qua cmd nhé. Tuy nhiên bạn vẫn có thể sử dụng gui tool để quản lý kết nối của nó như (Navicat, MySQl Workbench ...vv)
Chú ý: Mặc định khi cài đặt xong mysql ta luôn có một tài khoản root với thông tin user: root, password: ''  (thằng này max ping quyền này, để rơi vào tay thằng khác thì xác định cho không nó cả hệ thống db nhé). Mình sẽ sử dụng root để thiết lập các khối lệnh trong mysql command phía bên dưới này. 
    Xong xuôi hết rồi thì mình dạo qua một số lệnh cơ bản khi làm việc với nó để chánh bỡ ngỡ nhé. Chú ý là mình sẽ hướng dẫn thao tác trên dòng lệnh để hiểu hơn trước nhé

2. Một số tệp lệnh cơ bản trong MySql

- Lệnh tắt, mở mysql
  • systemctl restart mysql (hoặc service mysql restart): khởi động lại mysql.
  • systemctl start mysql (hoặc service mysql start): khởi động mysql.
  • systemctl status mysql (hoặc service mysql status): xem trạng thái hoạt động của mysql
  • systemctl stop mysql (hoặc service stop mysql): tắt mysql
- Truy vấn cơ bản: để thực hiện vài lệnh này thì bạn cần truy cập vào mysql trên command (không phải trên gui tool nhé).  trên cửa số dòng lệnh gõ mysql -u root -p và enter.  Thực hiện test thử vài đoạn lệnh
  • show databases: hiển thị các db đang có trong hệ thống
  • create database <name_database> : tạo 1 cơ sở dữ liệu
  • create database if not exists <name_database>: tạo csdl nếu nó ko tồn tại
  • drop database <name_database>: hủy một cơ sở dữ liệu tồn tai trong hệ thống
- Quản lý các plugin cài đặt trong mysql (phần này khá quan trọng vì một số plugin hỗ trợ và cũng có thể cản trở bạn trong quá trình thiết lập quyền)
  • show plugins: Hiển thị toàn bộ các plugin cài đặt trong mysql
  • show variables like '<name_plugin>%' : Hiển thị các thiết lập trong plugin đó
           Ví dụ: show variables like 'validate_password%' (hiển thị các plugin validate password)
  • set global <variable_name > = value: trong đó variable_name và value mặc định bạn có thể xem bằng câu lệnh show variable like … mình vừa đề cập ở trên.
  • uninstall plugin name_plugin: gỡ cài đặt 1 plugin chỉ định.
Một vài lệnh trên để ta làm việc và biết được cái nhìn tổng quan trên csdl mysql nó có cái gì. Để tập chung vào bài viết mình sẽ chuyển hướng sang mục phân quyền luôn mà ko đi vào các câu lệnh thao tác crud nữa nhé 

3. Quản lý user cơ bản trong MySql

    Trước khi đi vào quản lý quyền thì ta phải học cách tạo user trước. Giờ không có user mà thiết lập quyền thì biết lấy quyền gán cho user nào hehe. (Giống như kiểu thành lập công ty mới tạo ra cả 1 tá quyền hành tổng giám đốc, CEO, CIO, CTO ... xong cuối cùng chả có người nào để cấp quyền 😂). Rồi vậy thì đi tạo user thôi.
a) Tổng hợp các cách tạo user
    Mình sẽ sử dụng cú pháp tạo user từ các phiên bản trước mysql 5.7.6. Kể từ phiên bản 5.7.6 trở lên thì cú pháp có thêm nhiều tùy chọn hơn rất nhiều (đương nhiên là các bạn sử dụng mysql phiên bản cao hơn vẫn có thể sử dụng các lệnh của phiên bản thấp hơn mà mình đề cập dưới đây nhé). Cú pháp cơ bản trông như này
CREATE USER user [auth_option]...    => Trong đó: 
  • user  <=>  'USER_NAME'@'HOST_NAME || IP': phần này định nghĩa thông tin tên user và host sử dụng (host có thể là host name hoặc ip)Mình sẽ đi giải thích kỹ phần này qua các example dưới đây
    • create user admin_test1@'localhost': tạo user tên là admin_test1 và cho phép truy cập trên host có tên là localhost. Bạn cũng có thể thiết lập các ip trên local của bạn theo ý muốn, chẳng hạn như 127.0.0.1 ...
    • create user admin_test2@'42.113.202.50': tạo user admin_test3 và chỉ cho phép truy cập vào ip từ xa (ở đây chính là ip 42.113.202.50). Cái này chỉ thích hợp khi bạn muốn làm việc nội bộ. Bởi vì bạn chỉ định rõ ip của mạng sử dụng lên tất cả các kết nối từ xa đều sẽ bị từ chối, ngoại trừ ip của mạng được cấp (Để xem ip mạng bạn đang sử dụng có thể vào trang web này nhé ).
    • create user 'user-pro'@'localhost': tạo user có tên user-pro kết nối tới localhost. Trường hợp này do user-pro liên kết với nhau qua dấu '-' lên mình phải sử dụng cặp dấu nháy đơn ''. Các trường hợp như ở trên là không cần vì tên user viết liền.
    • pattern: chỉ có 2 pattern được cho phép định nghĩa trong ip hoặc host %
      • create user admin_test4@'%': tạo user admin_test4 và cho phép mọi ip có thể truy cập.
      • create user admin_test5@'%.com.vn': tạo user admin_test5 và cho phép tất cả các host name có đuôi .com.vn được phép truy cập. Rất hay phải không ạ. Như này thì thù miền thằng nào khỏi cho nó vào luôn.
      • create user admin_test6@'192.168.1.%': chấp nhận tất cả các ip thuộc giải C network
      • Và còn khá nhiều tùy chọn pattern cũng như ý nghĩa của nó. Chi tiết bạn có thể xem tại đây
  • auth_option: Đây là các tùy chọn đính kèm theo việc tạo user. option trên trang chủ ghi rất phức tạp. làm mình backcape đi backscape lại và cuối cùng mình thấy đi tới example là dễ hiểu nhất.
    • create user 'admintest7'@'localhost' identified by '123456' password expire: Tạo user admintest7 trên localhost và mật khẩu truy cập là 123456a@ + lần đầu tiên truy cập sẽ phải thay đổi mật khẩu, nếu không lần tiếp theo không thể sử dụng tài khoản này để authen
    • create user 'admintest8'@'localhost' identified with sha256_password by '123456a@' password expire interval 30 DAY: Thiết lập tài khoản chỉ cho phép sử dụng mật khẩu trong vòng 30 ngày
    • Và vô số tùy chọn khác bạn có thể tham khảo thêm tại đây
Chú ý: Tất cả các bạn user bạn tạo đề nằm trong database có tên 'mysql'  và table tương ứng là 'user'.
b) Một số lỗi phát sinh khi tạo user
Lỗi 1 'ERROR 1819 (HY000): Your password does not satisfy the current policy requirements' : Đây là lỗi do mysql có cài sẵn plugin validate_password_length. Plugin này giúp validate mật khẩu đầu vào. Để xem chuẩn mà plugin này yêu cầu bạn sử dụng bạn gõ lệnh show varialles like 'validate_password%'; nó sẽ hiện ra cửa số như thế này
    Tùy vào plugin này cài đặt mà có thể ở máy khác các value sẽ khác. Dựa theo plugin này mình có 3 cách giải quyết
  • Cách 1: nhập theo các chuẩn mà nó mong muốn => Lỗi được khắc phục. 
  • Cách 2: Thay đổi lại các thiết lập mặc định của nó để được thiết lập như mình mong muốn. Để thực hiện việc này bạn sử dụng lệnh sau để set lại value cho biến: 
            SET GLOBAL Variable_name = <set_value>;
     Chẳng hạn minh không muốn độ dài chỉ là 7 thôi và cho tính bảo mật nó thấp thôi không cần MEDIUM chỉ cần LOW là đủ. mình sẽ làm như này
            SET GLOBAL validate_password_length = 7;
            SET GLOBAL validate_password_policy = LOW;
  • Cách 3: Remove luôn plugin đỡ phải vali với chả đết😎
            UNINSTALL PLUGIN validate_password; (Để xem nhiều hơn plugin bạn có thể gõ lệnh show plugins)   


Lỗi 2: Quên tài khoản root: Liên kết tham khảo này sẽ giúp bạn giải quyết vấn đề này trên cả windows và linux.

c) Xem các thiết lập cơ bản về user
Để xem lại các thiết lập tài khoản cho user. Ta sẽ sử dụng một số lệnh dưới đây
  • mysql -u root p: khi thực hiện lệnh này nó sẽ yêu cầu bạn nhập tài khoản root để đăng nhập được vào mysql (khi mới cài đặt nó sẽ không yêu cầu do root mặc định là empty '' rồi)
  • select user,host from mysql.user : xem thông tin của tất cả các user có trên hệ thống (mọi user được tạo từ riêng mỗi cơ sở dữ liệu cũng hiển thị hết)
  • select user() : xem thông tin của tất cả các user ứng với db đang truy cập (vì 1 db có thể tạo nhiều user mà)
  • select current_user(): xem thông tin của user hiện tại đang sử dụng ứng với db đang truy cập
  • show grants: xem các quyền được cấp cho db hiện tại
  • show grants for 'user_name'@'host': hiển thị tất cả các quyền của tài khoản có user là 'user_name'
    • ví dụ: show grants for 'nguyenmanh'@'localhost'  : <=> hiển thị toàn bộ các quyền đã được cấp cho tài khoản 'nguyenmanh'
  • rename user old_user to new_user: đổi tên user, ví dụ rename user 'admin10'@'localhost' to 'nguyenmanh'@'127.0.0.1';
  • drop user [if exists] user [, user] ...: Xóa user khỏi hệ thống mysql, ví dụ: drop user 'admin3'@'localhost';

4. Một số công cụ làm việc cơ bản với MySql

- Có 2 loại công cụ chính mà mình thấy mọi người hay sử dụng chính khi làm việc với mysql là 
  • Sử dụng webserver giả lập để làm việc với mysql: ở múc này có thể kể đến như Xammp hay Ampps đã đề cập ở đầu bài viết
  • Sử dụng các tool support mysql để quản lý mysql: Mysql Workbench hay Navicat
    Đây là bài viết đầu tiên trong một series ngắn về việc thiết lập phân quyền với mysql. Vì là bài đầu tiên lên mình chủ yếu đề cập tổng quan, sơ lược đôi chút về mysql và cách tạo user của nó để các bạn có cái nhìn sơ lược trước khi bắt đầu tiến hành đi tới việc phân quyền. Bài viết tới mình sẽ đi chi tiết vào việc phân quyền và thiết lập quyền cho mysql, các bạn nhớ theo dõi nhé. Đừng quên chia sẻ va comment ý kiến của bạn về cách mà bạn đang làm việc với hệ quản trị csdl này nha 😃 !

Tham khảo