翼度科技»论坛 编程开发 mysql 查看内容

MySQL 用户、权限管理,C/C++连接与使用

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
目录

用户

用户管理

mysql用户管理位于数据库mysql中的user表中
  1. mysql> show tables;
  2. +---------------------------+
  3. | Tables_in_mysql           |
  4. +---------------------------+
  5. | columns_priv              |
  6. | db                        |
  7. | engine_cost               |
  8. | event                     |
  9. | func                      |
  10. | general_log               |
  11. | gtid_executed             |
  12. | help_category             |
  13. | help_keyword              |
  14. | help_relation             |
  15. | help_topic                |
  16. | innodb_index_stats        |
  17. | innodb_table_stats        |
  18. | ndb_binlog_index          |
  19. | plugin                    |
  20. | proc                      |
  21. | procs_priv                |
  22. | proxies_priv              |
  23. | server_cost               |
  24. | servers                   |
  25. | slave_master_info         |
  26. | slave_relay_log_info      |
  27. | slave_worker_info         |
  28. | slow_log                  |
  29. | tables_priv               |
  30. | time_zone                 |
  31. | time_zone_leap_second     |
  32. | time_zone_name            |
  33. | time_zone_transition      |
  34. | time_zone_transition_type |
  35. | user                      |
  36. +---------------------------+
  37. 31 rows in set (0.00 sec)
复制代码
  1. mysql> select * from user\G;
  2. *************************** 1. row ***************************
  3.                   Host: localhost                                                        ## 允许的登录方式,localhost表示只允许本机登录
  4.                   User: root
  5.            Select_priv: Y
  6.            Insert_priv: Y
  7.            Update_priv: Y
  8.            Delete_priv: Y
  9.            Create_priv: Y
  10.              Drop_priv: Y
  11.            Reload_priv: Y
  12.          Shutdown_priv: Y
  13.           Process_priv: Y
  14.              File_priv: Y
  15.             Grant_priv: Y
  16.        References_priv: Y
  17.             Index_priv: Y
  18.             Alter_priv: Y
  19.           Show_db_priv: Y
  20.             Super_priv: Y
  21. Create_tmp_table_priv: Y
  22.       Lock_tables_priv: Y
  23.           Execute_priv: Y
  24.        Repl_slave_priv: Y
  25.       Repl_client_priv: Y
  26.       Create_view_priv: Y
  27.         Show_view_priv: Y
  28.    Create_routine_priv: Y
  29.     Alter_routine_priv: Y
  30.       Create_user_priv: Y
  31.             Event_priv: Y
  32.           Trigger_priv: Y
  33. Create_tablespace_priv: Y
  34.               ssl_type:
  35.             ssl_cipher:
  36.            x509_issuer:
  37.           x509_subject:
  38.          max_questions: 0
  39.            max_updates: 0
  40.        max_connections: 0
  41.   max_user_connections: 0
  42.                 plugin: mysql_native_password
  43. authentication_string: *********************************2E128811                ## 用户密码(经过password函数加密)
  44.       password_expired: Y
  45. password_last_changed: 2024-02-28 22:08:19
  46.      password_lifetime: NULL
  47.         account_locked: N
  48.         
  49. ### ....
复制代码
因此有一种简单粗暴的用户管理方法就是像USER表中插入用户数据,不过需要插入很多字段如权限那些,太过于麻烦;一般都是使用MySQL提供的方法进行用户管理;
查询所有用户
  1. mysql> select user,host from user;
  2. +---------------+-----------+
  3. | user          | host      |
  4. +---------------+-----------+
  5. | mysql.session | localhost |
  6. | mysql.sys     | localhost |
  7. | root          | localhost |
  8. +---------------+-----------+
  9. 3 rows in set (0.00 sec)
复制代码
查看当前用户
  1. mysql> select user();
  2. +--------+
  3. | user() |
  4. +--------+
  5. | root@  |
  6. +--------+
  7. 1 row in set (0.00 sec)
复制代码
查看当前连接数
  1. mysql> show processlist;
  2. +----+------+----------------------+------+---------+------+----------+------------------+
  3. | Id | User | Host                 | db   | Command | Time | State    | Info             |
  4. +----+------+----------------------+------+---------+------+----------+------------------+
  5. |  3 | root | localhost            | NULL | Query   |    0 | starting | show processlist |
  6. |  4 | chj  | *********            | NULL | Sleep   |    4 |          | NULL             |
  7. +----+------+----------------------+------+---------+------+----------+------------------+
  8. 2 rows in set (0.00 sec)
复制代码
创建用户

语法
  1. create user '用户名'@'ip' identified by '密码';
  2. flush privileges;                        ## 刷新权限
复制代码
涉及密码的操作mysql都不会记录下来
涉及权限的操作都需要刷新 ## flush privileges;


  • 仅限本地登录用户
  1. create user '用户名'@'localhost' identified by '密码';
复制代码

  • 仅限特定ip登录(一般都是内网,除了学习使用外一般不建议公网)
  1. create user '用户名'@'ip' identified by '密码';
复制代码

  • 所有用户可登录(危险,仅学习用,一般用户没有固定ip)
  1. create user '用户名'@'%' identified by '密码';
复制代码
如果遇到SSL不匹配问题,可以尝试在my.cnf中加入skip_ssl,注意位置不对可能不生效
删除用户

语法:
  1. drop user '用户名'@'主机名'
复制代码
修改密码规则

文章引用
查看规则/策略
  1. mysql> SHOW VARIABLES LIKE 'validate_password%';
  2. +--------------------------------------+--------+
  3. | Variable_name                        | Value  |
  4. +--------------------------------------+--------+
  5. | validate_password_check_user_name    | OFF    |
  6. | validate_password_dictionary_file    |        |
  7. | validate_password_length             | 8      |
  8. | validate_password_mixed_case_count   | 1      |
  9. | validate_password_number_count       | 1      |
  10. | validate_password_policy             | MEDIUM |
  11. | validate_password_special_char_count | 1      |
  12. +--------------------------------------+--------+
  13. 7 rows in set (0.00 sec)
复制代码
规则说明

属性默认值属性描述validate_password_check_user_nameOFF设置为ON的时候表示能将密码设置成当前用户名。validate_password_dictionary_file用于检查密码的字典文件的路径名,默认为空validate_password_length8密码的最小长度,也就是说密码长度必须大于或等于8validate_password_mixed_case_count1如果密码策略是中等或更强的,validate_password要求密码具有的小写和大写字符的最小数量。对于给定的这个值密码必须有那么多小写字符和那么多大写字符。validate_password_number_count1密码必须包含的数字个数validate_password_policyMEDIUMright-aligned 密码强度检验等级,可以使用数值0、1、2或相应的符号值LOW、MEDIUM、STRONG来指定。 0/LOW:只检查长度。 1/MEDIUM:检查长度、数字、大小写、特殊字符。 2/STRONG:检查长度、数字、大小写、特殊字符、字典文件。validate_password_special_char_count1密码必须包含的特殊字符个数临时设置

修改密码前可以修改密码规则
  1. #安全强度,默认为中,即1,要求必须包含 数字、符号、⼤⼩写字⺟,⻓度⾄少为8位
  2. set global validate_password_policy=0;                ## 设置为弱密码强度
  3. set global validate_password_length=1;        ## 设置密码最小长度
复制代码
持久设置

将以下内容添加到\etc\my.cnf中
  1. validate_password_policy=LOW
  2. validate_password_length=6
  3. validate_password_number_count=0
  4. validate_password_special_char_count=0
  5. validate_password_mixed_case_count=0
复制代码
修改密码


  • 自己改自己
  1. set password=password('新的密码');
复制代码

  • root改指定用户
  1. set password for '用户名'@'主机名'=password('新的密码');
复制代码

  • root直接对user表操作
  1. update user set authentication_string=password('111') where user='chj';
  2. flush privileges;
复制代码
  1. ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
  2. flush privileges;        ## 刷新权限
复制代码
权限

数据库提供的 权限列表


查看权限
  1. mysql> show grants for 'chj'@'%';
  2. +--------------------------------------------------+
  3. | Grants for chj@%                                 |
  4. +--------------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'chj'@'%'                  |
  6. | GRANT ALL PRIVILEGES ON `test_db`.* TO 'chj'@'%' |
  7. +--------------------------------------------------+
  8. 2 rows in set (0.00 sec)
复制代码
给用户授权

语法:
  1. grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'] ;
  2. ## identified by: 可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
  3. ## 密码一般忽略,因为一般都是先创建用户再授限,创建用户时密码已经设置好了;
复制代码
案例:
  1. grant select on ...
  2. grant select, delete, create on ....
  3. grant all  on ... -- 表示赋予该用户在该对象上的所有权限
  4. grant [privileges] on 库.*  to '用户名'@'登陆位置'
  5. ## 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
  6. grant [privileges] on *.*   to '用户名'@'登陆位置'
  7. ## *.*代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
复制代码
  1. ### 查看权限```mysql> show grants for 'chj'@'%';
  2. +--------------------------------------------------+
  3. | Grants for chj@%                                 |
  4. +--------------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'chj'@'%'                  |
  6. | GRANT ALL PRIVILEGES ON `test_db`.* TO 'chj'@'%' |
  7. +--------------------------------------------------+
  8. 2 rows in set (0.00 sec)```
复制代码
回收用户权限

案例:
  1. mysql> revoke delete on test_db.* from 'chj'@'%';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show grants for 'chj'@'%'\G;
  4. *************************** 1. row ***************************
  5. Grants for chj@%: GRANT USAGE ON *.* TO 'chj'@'%'
  6. *************************** 2. row ***************************
  7. Grants for chj@%: GRANT SELECT, INSERT, UPDATE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test_db`.* TO 'chj'@'%'
  8. 2 rows in set (0.00 sec)
复制代码
权限列表:
  1. SELECT, INSERT, UPDATE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER, DELETE
复制代码
使用C语言连接

mysql操作是线程安全的(事务)
以API路线认识mysql API的使用.
库的安装

如果是通过yum等安装方式安装的mysql,则在安装过程mysql开发包一般也安装好了,因此推荐这种方式安装mysql;
安装好后开发头文件目录位于/usr/include/mysql,库位于/usr/lib64/mysql
如果没有找到,说明可能没有安装,可以手动命令安装:
  1. yum install -y mysql-community-devel                        ## 开发包
复制代码
也可以单独下载mysql连接工具,MySQL :: Download MySQL Connector/C++ (Archived Versions);注意,如果能找到对应的版本是最好,不过现在旧版本官网可能不显示了,这个也无妨,mysql对新版本是能做到前后兼容的,因此可以下载推荐的8.x版本.这种方法缺点就是比较繁琐,还可能出现兼容性问题等,因此不是很推荐.
对下载下来的包中,目前最重要的是include文件夹与lib文件夹,有这两个目录就能C/C++连接数据库与开发.(需要动静态库系列知识)
linux generic: 通用版
C API

MySQL官方C接口声明
MySQL C 结构体
mysql_init

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()
  1. MYSQL* mysql_init(MYSQL *mysql);
复制代码
顾名思义,对 MYSQL* 对象进行初始化.
mysql_real_connect

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()
  1. MYSQL *mysql_real_connect(
  2.          MYSQL *mysql,               // 输出型参数:成功则返回mysql访问句柄,错误返回NULL;
  3.          const char *host,           // mysqld的ip
  4.         const char *user,           // 登录的用户名
  5.         const char *passwd,         // 登录密码
  6.         const char *db,             // 连接的数据库
  7.         unsigned int port,          // mysqld端口号
  8.         const char *unix_socket,    // 域间套接字(类似进程间管道通信)
  9.         unsigned long clientflag);  // 位图,启用一些特性;一般使用默认就好,即0
复制代码
注意:
需要先使用mysql_init初始化MYSQL*对象.
返回值
如果连接成功,则使用MYSQL*连接处理程序,如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。
mysql_close

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()
  1. void mysql_close(MYSQL *mysql);
复制代码
关闭
mysql_query

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.53 mysql_query()
  1. int mysql_query(
  2.                          MYSQL *mysql,
  3.       const char *stmt_str);
复制代码
注意:
官方文档中描述说到,不用在sql语句后面加上';'和'\G'
返回值:
成功返回0,失败返回错误码
模拟实现一个简单的MySQL客户端:
[code]#include#include#include#include#include#include/*MYSQL *mysql_real_connect(        MYSQL *mysql,               // 输出型参数:成功则返回mysql访问句柄,错误返回NULL        const char *host,           // mysqld的ip        const char *user,           // 登录的用户名        const char *passwd,         // 登录密码        const char *db,             // 连接的数据库        unsigned int port,          // mysqld端口号        const char *unix_socket,    // 域间套接字(类似进程间管道通信)        unsigned long clientflag);  // 位图,启用一些特性;一般使用默认就好,即0 */const std::string host = "127.0.0.1";const std::string user = "chj";const std::string passwd = "123456";const std::string db = "test_db";const unsigned int port = 3306;//const std::string socket = ;const unsigned long clientflag = 0;int main(){  std::cout

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具