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

news/2024/11/15 14:06:10/文章来源:https://www.cnblogs.com/DSCL-ing/p/18425292

目录
  • 用户
    • 用户管理
      • 查询所有用户
      • 查看当前用户
      • 查看当前连接数
    • 创建用户
    • 删除用户
    • 修改密码规则
      • 查看规则/策略
      • 规则说明
      • 临时设置
      • 持久设置
    • 修改密码
  • 权限
    • 数据库提供的 权限列表
    • 查看权限
    • 给用户授权
    • 回收用户权限
  • 使用C语言连接
    • 库的安装
    • C API
      • mysql_init
      • mysql_real_connect
      • mysql_close
      • mysql_query
      • mysql_set_character_set
      • mysql_store_result

用户

用户管理

mysql用户管理位于数据库mysql中的user表中

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)
mysql> select * from user\G;
*************************** 1. row ***************************Host: localhost							## 允许的登录方式,localhost表示只允许本机登录User: rootSelect_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YReload_priv: YShutdown_priv: YProcess_priv: YFile_priv: YGrant_priv: YReferences_priv: YIndex_priv: YAlter_priv: YShow_db_priv: YSuper_priv: YCreate_tmp_table_priv: YLock_tables_priv: YExecute_priv: YRepl_slave_priv: YRepl_client_priv: YCreate_view_priv: YShow_view_priv: YCreate_routine_priv: YAlter_routine_priv: YCreate_user_priv: YEvent_priv: YTrigger_priv: Y
Create_tablespace_priv: Yssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *********************************2E128811		## 用户密码(经过password函数加密)password_expired: Ypassword_last_changed: 2024-02-28 22:08:19password_lifetime: NULLaccount_locked: N### ....

因此有一种简单粗暴的用户管理方法就是像USER表中插入用户数据,不过需要插入很多字段如权限那些,太过于麻烦;一般都是使用MySQL提供的方法进行用户管理;

查询所有用户

mysql> select user,host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

查看当前用户

mysql> select user();
+--------+
| user() |
+--------+
| root@  |
+--------+
1 row in set (0.00 sec)

查看当前连接数

mysql> show processlist;
+----+------+----------------------+------+---------+------+----------+------------------+
| Id | User | Host                 | db   | Command | Time | State    | Info             |
+----+------+----------------------+------+---------+------+----------+------------------+
|  3 | root | localhost            | NULL | Query   |    0 | starting | show processlist |
|  4 | chj  | *********            | NULL | Sleep   |    4 |          | NULL             |
+----+------+----------------------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

创建用户

语法

create user '用户名'@'ip' identified by '密码'; 
flush privileges;			## 刷新权限

涉及密码的操作mysql都不会记录下来

涉及权限的操作都需要刷新 ## flush privileges;

  • 仅限本地登录用户
create user '用户名'@'localhost' identified by '密码'; 
  • 仅限特定ip登录(一般都是内网,除了学习使用外一般不建议公网)
create user '用户名'@'ip' identified by '密码'; 
  • 所有用户可登录(危险,仅学习用,一般用户没有固定ip)
create user '用户名'@'%' identified by '密码'; 

如果遇到SSL不匹配问题,可以尝试在my.cnf中加入skip_ssl,注意位置不对可能不生效

删除用户

语法:

drop user '用户名'@'主机名'

修改密码规则

文章引用

查看规则/策略

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

规则说明

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

临时设置

修改密码前可以修改密码规则

#安全强度,默认为中,即1,要求必须包含 数字、符号、⼤⼩写字⺟,⻓度⾄少为8位 
set global validate_password_policy=0;		## 设置为弱密码强度set global validate_password_length=1;	## 设置密码最小长度

持久设置

将以下内容添加到\etc\my.cnf

validate_password_policy=LOW
validate_password_length=6
validate_password_number_count=0
validate_password_special_char_count=0
validate_password_mixed_case_count=0

修改密码

  • 自己改自己
set password=password('新的密码');
  • root改指定用户
set password for '用户名'@'主机名'=password('新的密码');
  • root直接对user表操作
update user set authentication_string=password('111') where user='chj';
flush privileges;

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';flush privileges;	## 刷新权限

权限

数据库提供的 权限列表

image-20240911123237917

查看权限

mysql> show grants for 'chj'@'%';
+--------------------------------------------------+
| Grants for chj@%                                 |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'chj'@'%'                  |
| GRANT ALL PRIVILEGES ON `test_db`.* TO 'chj'@'%' |
+--------------------------------------------------+
2 rows in set (0.00 sec)

给用户授权

语法:

grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'] ;
## identified by: 可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
## 密码一般忽略,因为一般都是先创建用户再授限,创建用户时密码已经设置好了;

案例:

grant select on ...grant select, delete, create on ....grant all  on ... -- 表示赋予该用户在该对象上的所有权限grant [privileges] on 库.*  to '用户名'@'登陆位置'
## 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等) grant [privileges] on *.*   to '用户名'@'登陆位置'
## *.*代表本系统中的所有数据库的所有对象(表,视图,存储过程等) 
### 查看权限```
mysql> show grants for 'chj'@'%';
+--------------------------------------------------+
| Grants for chj@%                                 |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'chj'@'%'                  |
| GRANT ALL PRIVILEGES ON `test_db`.* TO 'chj'@'%' |
+--------------------------------------------------+
2 rows in set (0.00 sec)
```

回收用户权限

案例:

mysql> revoke delete on test_db.* from 'chj'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> show grants for 'chj'@'%'\G;
*************************** 1. row ***************************
Grants for chj@%: GRANT USAGE ON *.* TO 'chj'@'%'
*************************** 2. row ***************************
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'@'%'
2 rows in set (0.00 sec)

权限列表:

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

如果没有找到,说明可能没有安装,可以手动命令安装:

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()

MYSQL* mysql_init(MYSQL *mysql);

顾名思义,对 MYSQL* 对象进行初始化.

mysql_real_connect

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()

 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

注意:

需要先使用mysql_init初始化MYSQL*对象.

返回值

如果连接成功,则使用MYSQL*连接处理程序,如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。

mysql_close

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()

void mysql_close(MYSQL *mysql);

关闭

mysql_query

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.53 mysql_query()

int mysql_query(MYSQL *mysql,const char *stmt_str);

注意:

官方文档中描述说到,不用在sql语句后面加上';'和'\G'

返回值:

成功返回0,失败返回错误码

模拟实现一个简单的MySQL客户端:

#include<iostream>
#include<mysql/mysql.h>
#include<string>
#include<cassert>
#include<chrono>
#include<thread>/*
MYSQL *mysql_real_connect(MYSQL *mysql,               // 输出型参数:成功则返回mysql访问句柄,错误返回NULLconst 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<<"mysql client version :" << mysql_get_client_info()<<std::endl;MYSQL* mysql = mysql_init(nullptr);if(mysql == nullptr){std::cerr<<" mysql init error "<<std::endl;return 1;}if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,clientflag)){std::cout<<"conect success" <<std::endl;}else{std::cerr<<"mysql connect error"<<std::endl;return 2;}std::string sql;while(true){std::cout<<"mysql >>> ";if(!std::getline(std::cin,sql)) break;if(sql == "quit" || sql == "exit") break;int n = mysql_query(mysql,sql.c_str());if(n == 0){std::cout<<sql<<" sucess"<<std::endl;}else{std::cerr<<sql<<" failed, "<<n<<std::endl;}}mysql_close(mysql);return 0;
}

mysql_set_character_set

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.69 mysql_set_character_set()

int mysql_set_character_set(MYSQL *mysql,const char *csname);	//cs == character set

问题: 一般来说,mysqld也是设置成utf8的,C/C++代码也是utf8的,为什么中文可能会出现乱码呢?

解析: 两端都没问题,那问题只能出自于链接,因此需要设置链接字符集

建立好链接之后,获取英文没有问题,如果获取中文是乱码:
设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

mysql_store_result

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.77 mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/801515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帝国默认后台用户名及认证码,帝国CMS忘记后台登陆用户名 密码 认证码 安全提问答案 数据库用户名及密码的解决方法

当你忘记了帝国CMS后台的登录信息,包括用户名、密码、认证码、安全提问答案或数据库的用户名及密码时,可以采取以下几种方法来解决问题: 忘记用户名和密码默认信息帝国CMS在某些版本中提供了默认的后台登录信息,例如账号admin,密码admin888。不过,这并不适用于所有版本,…

帝国cms网站建站程序安装教程

帝国CMS网站建站程序安装教程 工具/原料已搭建好PHP环境的服务器或者本地测试环境。 帝国CMS建站程序安装包。方法/步骤下载帝国CMS安装包百度搜索“帝国CMS官网”,进入帝国CMS官网。 找到下载页面,根据需要选择对应的版本下载程序安装包。解压并上传文件解压帝国CMS安装包。…

HTB-GreenHorn 靶机笔记

GreenHorn 靶机笔记 概述 GreenHorn 是 HTB 上的一个 linux easy 难度的靶机,主要是通过信息搜集和代码审计能不能找到对我们有用的信息。 靶机地址:https://app.hackthebox.com/machines/GreenHorn 一丶 nmap 扫描 1)端口扫描 -sT 以 TCP 全连接扫描,--min-rate 10000 以最…

ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录

某浪博客又抽风了,莫名其妙的将访问量清零了,这是赶人走的意思吧? 我把那边的内容搬到这里吧,万一哪天那边关张了,辛辛苦苦的学习笔记就没了。 原博客地址:ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录_来自金沙江的小鱼_新浪博客 (sina.com.cn) 现场有几套ABB…

常佳鑫第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 完成一篇自我介绍随笔的编写,同时熟悉并掌握Markdown的基本语法姓名-学号 常佳鑫-2022329301071自我介绍 个人基本信息与兴趣爱好基本信息姓名 常佳鑫 专业 自动化 籍贯 河南南阳兴趣爱好羽毛球…

[Spring]过滤器

过滤器Filter作为Java三大器之一,在Java Web的使用中有很高的地位。所谓过滤器,就是实现了javax.servlet.Filter接口的服务器端程序。 Filter有如下几个用处:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。 根据需要检查HttpServletRequest,也可以修…

使用 GitHub Actions Pages 托管 Honkit 发布的网站

使用 GitHub Actions & Pages 托管 Honkit 发布的网站 Created: 2024-09-22T13:48+08:00 Published: 2024-09-22T14:28+08:00 Category: DevOps 作为张雨生的骨灰级粉丝,我一直想把雨生的资料尽可能地收集起来,用网站或者电子书的形式发布。 一番查找后,我选择了 honkit…

MySQL 用户与权限 C连接与使用

目录用户用户管理查询所有用户查看当前用户查看当前连接数创建用户删除用户修改密码规则查看规则/策略规则说明临时设置持久设置修改密码权限数据库提供的 权限列表查看权限给用户授权回收用户权限使用C语言连接库的安装C APImysql_initmysql_real_connectmysql_closemysql_que…

如果防止feign的超时调用造成多次扣减库存

问题:订单服务在通过feign调用库存服务进行库存扣减的时候,我们知道feign是有超时重试机制的。当出现feign超时,或者网络抖动的时候,订单服务以为上次调用没有成功,即使实际上调用成功了,还是会再次调用。库存服务无法区分是否为同一个操作,导致 相同操作被…

[Spring]拦截器

Interceptor 介绍拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。 你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置...... 在 Spring中,当请求发送…

win10x64位+nmake编译geos3.7.1

说明:使用nmake进行编译,最新的geos3.13似乎已经不能用nmake进行编译了,不过3.7.1已经够用了。 1、 解压geos-3.7.1,定位到根目录下的namke.opt文件,这个文件控制着nmake编译的一些参数。 2、 打开nmake.opt,找到如下片段: ###########################################…

Nuxt Kit API :路径解析工具

title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中用于解析路径的API工具,包括resolvePath、resolveAlias、findPath和createResolver。这些工具助力开发者处理模块路径、别名、文件扩展名,提…