🍁 作者:微枫
Micromaple💒 主页:欢迎关注Micromaple
📌 简介:Java程序员、后端全栈工程师
🔗 点赞👍➕收藏⭐➕留言📝 您的支持就是我前进的动力💪💪💪
大家好,我是微枫
Micromaple,下面是我的Mycat系列专栏(持续更新ing),有喜欢的小伙伴欢迎订阅学习呀🚀 深入学习Mycat
✨ Mycat系列专栏:点我学习
🔥 Mycat主从搭建、读写分离:点我学习
🔥 Mycat实现分库分表:点我学习
🔥 Mycat实现单库水平分表、按月分表:点我学习
🔥 Mycat高可用方案-HAProxy+Keepalived:点我学习
目录
目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xml 的 user 标签进行配置。
server.xml的 user部分标签例子:
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
配置说明
name :应用连接中间件逻辑库的用户名password:该用户名对应的密码schemas:应用当前连接的逻辑库中所对应的逻辑表。可以配置一个或多个,多个使用,分开readOnly:是否只读使用user用户,权限为只读,即readOnly: true。验证是否可以查询和写入数据。
使用user用户登录,运行命令如下
mysql -uuser -puser -h 192.168.110.145 -P8066
切换到TESTDB数据库
use TESTDB;
查询orders数据
mysql> select * from orders;
+--------+------------+-------------+-----------+
| id | order_type | customer_id | amount |
+--------+------------+-------------+-----------+
| 1 | 101 | 100 | 100100.00 |
| 2 | 101 | 100 | 100300.00 |
| 6 | 102 | 100 | 100020.00 |
| 3 | 101 | 101 | 120000.00 |
| 4 | 101 | 101 | 103000.00 |
| 5 | 102 | 101 | 100400.00 |
| 400100 | 102 | 101 | 1000.00 |
| 400101 | 102 | 101 | 1000.00 |
| 400200 | 102 | 101 | 1000.00 |
| 400201 | 102 | 101 | 1000.00 |
+--------+------------+-------------+-----------+
10 rows in set (0.09 sec)
执行插入数据SQL
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
可以看到运行结果,插入失败,用户只有只读权限,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
ERROR 1495 (HY000): User readonly
使用mycat用户,权限为可读可写,即readOnly: false。验证是否可以查询和写入数据。
使用mycat用户登录,运行命令如下
mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到TESTDB数据库
use TESTDB;
查询orders数据
mysql> select * from orders;
+--------+------------+-------------+-----------+
| id | order_type | customer_id | amount |
+--------+------------+-------------+-----------+
| 1 | 101 | 100 | 100100.00 |
| 2 | 101 | 100 | 100300.00 |
| 6 | 102 | 100 | 100020.00 |
| 3 | 101 | 101 | 120000.00 |
| 4 | 101 | 101 | 103000.00 |
| 5 | 102 | 101 | 100400.00 |
| 400100 | 102 | 101 | 1000.00 |
| 400101 | 102 | 101 | 1000.00 |
| 400200 | 102 | 101 | 1000.00 |
| 400201 | 102 | 101 | 1000.00 |
+--------+------------+-------------+-----------+
10 rows in set (0.01 sec)
执行插入数据SQL
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
可看到运行结果,插入成功,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
Query OK, 1 row affected (0.02 sec)
在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的 DML 权限控制。
privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false。
由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema) ,所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
server.xml的 privileges部分标签,进行配置orders表没有增删改查权限
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="orders" dml="0000"></table>
<!-- <table name="tb02" dml="1111"></table> -->
</schema>
</privileges>
</user>
参数配置说明:
check:是否开启
DML权限设置配置说明如下
DML权限 | 增加(insert) | 更新(update) | 查询(select) | 删除(delete) |
|---|---|---|---|---|
| 0000 | ❌ | ❌ | ❌ | ❌ |
| 0010 | ❌ | ❌ | ⭕ | ❌ |
| 1110 | ⭕ | ❌ | ❌ | ❌ |
| 1111 | ⭕ | ⭕ | ⭕ | ⭕ |
使用mycat用户,privileges配置orders表权限为禁止增删改查(dml="0000"),验证是否可以查询出数据,验证是否可以写入数据。
重启Mycat,使用mycat用户登录,命令如下:
mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到TESTDB数据库
use TESTDB;
查询orders数据
select * from orders;
可以看到禁止该用户查询数据,如下:
mysql> select * from orders;
ERROR 3012 (HY000): The statement DML privilege check is not passed, reject for user 'mycat'
执行插入数据SQL,如下:
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
可看到运行结果,禁止该用户插入数据,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
ERROR 3012 (HY000): The statement DML privilege check is not passed, reject for user 'mycat'
使用mycat用户,privileges配置orders表权限为可以增删改查(dml="1111"),验证是否可以查询出数据,验证是否可以写入数据。
修改配置文件server.xml的name为mycat的user标签部分。内容如下:
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="orders" dml="1111"></table>
<!-- <table name="tb02" dml="1111"></table> -->
</schema>
</privileges>
</user>
重启Mycat,使用mycat用户登录,命令如下:
mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到TESTDB数据库
use TESTDB;
查询orders数据
select * from orders;
可以看到查询数据,如下:
mysql> select * from orders;
+--------+------------+-------------+-----------+
| id | order_type | customer_id | amount |
+--------+------------+-------------+-----------+
| 1 | 101 | 100 | 100100.00 |
| 2 | 101 | 100 | 100300.00 |
| 6 | 102 | 100 | 100020.00 |
| 3 | 101 | 101 | 120000.00 |
| 4 | 101 | 101 | 103000.00 |
| 5 | 102 | 101 | 100400.00 |
| 7 | 101 | 101 | 10000.00 |
| 400100 | 102 | 101 | 1000.00 |
| 400101 | 102 | 101 | 1000.00 |
| 400200 | 102 | 101 | 1000.00 |
| 400201 | 102 | 101 | 1000.00 |
+--------+------------+-------------+-----------+
11 rows in set (0.07 sec)
执行插入数据SQL,如下:
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
可看到运行结果,插入成功,如下:
mysql> insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
Query OK, 1 row affected (0.01 sec)
mysql> select * from orders;
+--------+------------+-------------+-----------+
| id | order_type | customer_id | amount |
+--------+------------+-------------+-----------+
| 1 | 101 | 100 | 100100.00 |
| 2 | 101 | 100 | 100300.00 |
| 6 | 102 | 100 | 100020.00 |
| 3 | 101 | 101 | 120000.00 |
| 4 | 101 | 101 | 103000.00 |
| 5 | 102 | 101 | 100400.00 |
| 7 | 101 | 101 | 10000.00 |
| 8 | 101 | 101 | 10000.00 |
| 400100 | 102 | 101 | 1000.00 |
| 400101 | 102 | 101 | 1000.00 |
| 400200 | 102 | 101 | 1000.00 |
| 400201 | 102 | 101 | 1000.00 |
+--------+------------+-------------+-----------+
12 rows in set (0.00 sec)
firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单 ,blacklist 用来定义SQL 黑名单。
可以通过设置白名单,实现某主机某用户可以访问 Mycat,而其他主机用户禁止访问。
设置白名单步骤如下:
修改server.xml配置文件firewall标签。配置只有192.168.110.146主机可以通过mycat用户访问
<firewall>
<whitehost>
<host host="192.168.110.146" user="mycat"/>
</whitehost>
</firewall>
host:IP白名单user:允许访问的用户重启Mycat后,在192.168.110.146主机使用mycat用户访问,可以正常访问。如下:
# 查看IP地址
root@ubuntu-mysql-master:~# <font color="#808000;">ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.110.146/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe30:ff90/64 scope link
valid_lft forever preferred_lft forever
# mycat用户登录Mycat
root@ubuntu-mysql-master:~# mysql -umycat -p123456 -h 192.168.110.145 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.6-release-20220524173810 MyCat Server (OpenCloudDB)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
在此主机换user用户登录,禁止访问。如下:
# 查看IP地址
root@ubuntu-mysql-master:~# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:30:ff:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.110.146/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe30:ff90/64 scope link
valid_lft forever preferred_lft forever
# user用户登录Mycat
root@ubuntu-mysql-master:~# mysql -uuser -puser -h 192.168.110.145 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (HY000): Access denied for user 'user' with host '192.168.110.146'
在192.168.110.148主机使用mycat用户访问,禁止访问。如下:
# 查看IP地址
root@ubuntu-mysql-master2:~# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c6:3f:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.110.148/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec6:3f01/64 scope link
valid_lft forever preferred_lft forever
# mycat用户登录Mycat
root@ubuntu-mysql-master2:~# mysql -umycat -p123456 -h 192.168.110.145 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (HY000): Access denied for user 'mycat' with host '192.168.110.148'
可以通过设置黑名单,实现 Mycat 对具体 SQL 操作的拦截,如增删改查等操作的拦截。
设置黑名单步骤如下:
修改server.xml配置文件firewall标签。配置禁止mycat用户进行删除操作。
<firewall>
<whitehost>
<host host="192.168.110.146" user="mycat"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
check:是否开启白名单deleteAllow:是否允许执行DELETE语句重启Mycat后,在192.168.110.146主机使用mycat用户访问。
mysql -umycat -p123456 -h 192.168.110.145 -P8066
切换到TESTDB数据库
use TESTDB;
执行删除语句
delete from orders where id=7;
运行后发现禁止删除数据,如下:
mysql> delete from orders where id=7;
ERROR 3012 (HY000): The statement is unsafe SQL, reject for user 'mycat'
| 配置项 | 默认值 | 描述 |
|---|---|---|
selelctAllow | true | 是否允许执行 SELECT 语句 |
deleteAllow | true | 是否允许执行 DELETE 语句 |
updateAllow | true | 是否允许执行 UPDATE 语句 |
insertAllow | true | 是否允许执行 INSERT 语句 |
createTableAllow | true | 是否允许创建表 |
setAllow | true | 是否允许使用 SET 语法 |
alterTableAllow | true | 是否允许执行 Alter Table 语句 |
dropTableAllow | true | 是否允许修改表 |
commitAllow | true | 是否允许执行 commit 操作 |
rollbackAllow | true | 是否允许执行 roll back 操作 |
读到这里,想必你对
Mycat安全设置的认识清晰了不少,别忘了三连支持博主呀,我是微枫micromaple,期待你的关注💪💪💪
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U