Postgre数据库用户权限总结

2023-05-16

1、故事起源
我们的项目使用了PG数据库,在项目开发阶段,为了省事偷懒,直接将应用连接数据库的用户给了supperuser权限,用起来简直不要太爽。随着开发进度接近中后期,开始筹建用户验收环境,在该环境我依旧直接给了超级用户权限,谁曾想就在前几天甲方爸爸哗啦啦的给了一堆漏洞清单,让我们抓紧整改。一头雾水的我不得不重操旧业,开始四处学习PG的用户权限相关知识。

2、干货记录
2.1 、创建用户时的权限分配

CREATE USER/ROLE name [ [ WITH ] option [ ... ] ]  : 关键词 USER,ROLE; name 用户或角色名; 
where option can be:
      SUPERUSER | NOSUPERUSER      :超级权限,拥有所有权限,默认nosuperuser。
    | CREATEDB | NOCREATEDB        :建库权限,默认nocreatedb。
    | CREATEROLE | NOCREATEROLE    :建角色权限,拥有创建、修改、删除角色,默认nocreaterole。
    | INHERIT | NOINHERIT          :继承权限,可以把除superuser权限继承给其他用户/角色,默认inherit。
    | LOGIN | NOLOGIN              :登录权限,作为连接的用户,默认nologin,除非是create user(默认登录)。
    | REPLICATION | NOREPLICATION  :复制权限,用于物理或则逻辑复制(复制和删除slots),默认是noreplication。
    | BYPASSRLS | NOBYPASSRLS      :安全策略RLS权限,默认nobypassrls。
    | CONNECTION LIMIT connlimit   :限制用户并发数,默认-1,不限制。正常连接会受限制,后台连接和prepared事务不受限制。
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL :设置密码,密码仅用于有login属性的用户,不使用密码身份验证,则可以省略此选项。可以选择将空密码显式写为PASSWORD NULL。                                                         加密方法由配置参数password_encryption确定,密码始终以加密方式存储在系统目录中。
    | VALID UNTIL 'timestamp'      :密码有效期时间,不设置则用不失效。
    | IN ROLE role_name [, ...]    :新角色将立即添加为新成员。
    | IN GROUP role_name [, ...]   :同上
    | ROLE role_name [, ...]       :ROLE子句列出一个或多个现有角色,这些角色自动添加为新角色的成员。 (这实际上使新角色成为“组”)。
    | ADMIN role_name [, ...]      :与ROLE类似,但命名角色将添加到新角色WITH ADMIN OPTION,使他们有权将此角色的成员资格授予其他人。
    | USER role_name [, ...]       :同上
    | SYSID uid                    :被忽略,但是为向后兼容性而存在。

示例

--不需要密码
postgres=# CREATE ROLE aikes LOGIN;
CREATE ROLE
--需要密码
postgres=# CREATE USER aikes WITH PASSWORD '10JQKA';
CREATE ROLE

备注
1、create user命令等同于create role,除了一点:create user有隐含的login权限;而create role不会有该权限。
2、创建该用户后,还不能直接登录。需要修改 pg_hba.conf 文件,trust不验证密码,MD5验证密码(后文有说明)

①:本地登陆:local   all    all    trust
②:远程登陆:host   all    all    192.168.100.133/32     md5

补充

创建复制用户
CREATE USER abc REPLICATION LOGIN ENCRYPTED PASSWORD '';
CREATE USER abc REPLICATION LOGIN ENCRYPTED PASSWORD 'abc';
ALTER USER work WITH ENCRYPTED password '';

创建scheme 角色
CREATE ROLE abc;
CREATE DATABASE abc WITH OWNER abc ENCODING UTF8 TEMPLATE template0;
\c abc

创建schema
CREATE SCHEMA abc;
ALTER SCHEMA abc OWNER to abc;
revoke create on schema sche from sche ;

创建用户
create user abc with ENCRYPTED password '';
GRANT abc to abc;
ALTER ROLE abc WITH abc;

##创建读写账号
CREATE ROLE abc_rw;
CREATE ROLE abc_rr;

##赋予访问数据库权限,schema权限
grant connect ON DATABASE abc to abc_rw;
GRANT USAGE ON SCHEMA abc TO abc_rw;

##赋予读写权限
grant select,insert,update,delete ON  ALL TABLES IN SCHEMA abc to abc;

赋予序列权限
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA abc to abc;

赋予默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT select,insert,update,delete ON TABLES TO abc;

赋予序列权限
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT ALL PRIVILEGES ON SEQUENCES TO abc;


#用户对db要有连接权限
grant connect ON DATABASE abc to abc;

#用户要对schema usage 权限,不然要select * from schema_name.table ,不能用搜索路径
GRANT USAGE ON SCHEMA abc TO abc;
grant select ON ALL TABLES IN SCHEMA abc to abc;
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT select ON TABLES TO abc;

create user abc_w with ENCRYPTED password '';
create user abc_r with ENCRYPTED password '';

GRANT abc_rw to abc_w;

GRANT abc_rr to abc_r;

2.2、用户权限授予和收回

权限说明

SELECT:允许从指定表,视图或序列的任何列或列出的特定列进行SELECT。也允许使用COPY TO。在UPDATE或DELETE中引用现有列值也需要此权限。对于序列,此权限还允许使用currval函数。对于大对象,此权限允许读取对象。

INSERT:允许将新行INSERT到指定的表中。如果列出了特定列,则只能在INSERT命令中为这些列分配(因此其他列将接收默认值)。也允许COPY FROM。

UPDATE:允许更新指定表的任何列或列出的特定列,需要SELECT权限。

DELETE:允许删除指定表中的行,需要SELECT权限。

TRUNCATE:允许在指定的表上创建触发器。

REFERENCES:允许创建引用指定表或表的指定列的外键约束。

TRIGGER:允许在指定的表上创建触发器。 

CREATE:对于数据库,允许在数据库中创建新的schema、table、index。

CONNECT:允许用户连接到指定的数据库。在连接启动时检查此权限。

TEMPORARY、TEMP:允许在使用指定数据库时创建临时表。

EXECUTE:允许使用指定的函数或过程以及在函数。

USAGE:对于schema,允许访问指定模式中包含的对象;对于sequence,允许使用currval和nextval函数。对于类型和域,允许在创建表,函数和其他模式对象时使用类型或域。

ALL PRIVILEGES:一次授予所有可用权限。

授予权限

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

##单表授权:授权aikes账号可以访问schema为sche 的demo表  
grant select,insert,update,delete on sche.demo to aikes;
##所有表授权:grant select,insert,update,delete on all tables in schema sche to aikes;

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

##序列(自增键)属性授权,指定sche schema下的seq_id_seq 给aikes用户
grant select,update on sequence sche.seq_id_seq to aikes;
##序列(自增键)属性授权,给用户aikes授权sche schema下的所有序列
grant select,update on all sequences in schema sche to aikes;

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

##连接数据库权限,授权aikes 用户连接数据库dbdemo
grant connect on database dbdemo to aikes ;

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

##连接schema权限,授权aikes访问sche schema权限
grant usage on schema sche to aikes;

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]
##把aikes用户的权限授予用户mark。grant aikes to mark;

撤销权限

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ] 

##移除用户aikes在schema sche 上所有表的select权限 
revoke select on all tables in schema sche from aikes;

##序列
REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

##库
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]
    
REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

##schena权限
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]
    
REVOKE [ ADMIN OPTION FOR ]
    role_name [, ...] FROM role_name [, ...]
    [ CASCADE | RESTRICT ]

修改用户属性

ALTER USER role_specification [ WITH ] option [ ... ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'

ALTER USER name RENAME TO new_name

ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

where role_specification can be:

    role_name
  | CURRENT_USER
  | SESSION_USER

##示例 alter role aikes with superuser;

2.3、配置文件中的访问控制
通过修改pg_hba.conf文件,实现访问控制
METHOD解释:

trust:允许无条件连接,允许任何PostgreSQL用户身份登录,而无需密码或任何其他身份验证。
reject:拒绝任何条件连接,这对于从组中“过滤掉”某些主机非常有用。
scram-sha-256:执行SCRAM-SHA-256身份验证以验证用户的密码。
md5:执行SCRAM-SHA-256或MD5身份验证以验证用户的密码。
password:要提供未加密的密码以进行身份​​验证。由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用。
gss:使用GSSAPI对用户进行身份验证,这仅适用于TCP / IP连接。
sspi:使用SSPI对用户进行身份验证,这仅适用于Windows。
ident:通过联系客户端上的ident服务器获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。 Ident身份验证只能用于TCP / IP连接。为本地连接指定时,将使用对等身份验证。
peer:从操作系统获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。这仅适用于本地连接。
ldap:使用LDAP服务器进行身份验证。
radius:使用RADIUS服务器进行身份验证。
cert:使用SSL客户端证书进行身份验证。
pam:使用操作系统提供的可插入身份验证模块(PAM)服务进行身份验证。
bsd:使用操作系统提供的BSD身份验证服务进行身份验证。
# TYPE  DATABASE    USER   ADDRESS   METHOD
local          all               all                         trust
--在本地允许任何用户无密码登录
local          all                all                        peer
--操作系统的登录用户和pg的用户是否一致,一致则可以登录
local          all                all                        ident
--操作系统的登录用户和pg的用户是否一致,一致则可以登录
host          all                all    192.168.163.0/24   md5
--指定客户端IP访问通过md5身份验证进行登录
host          all                all     192.168.163.132/32   password
--指定客户端IP通过passwotd身份验证进行登录

host    all             all     192.168.54.1/32         reject
host    all             all     192.168.0.0/16           ident  
host    all             all     127.0.0.1       255.255.255.255     trust
...

设置成功后需要重新加载配置文件,不需要重启数据库

postgres=# select pg_reload_conf();
 pg_reload_conf 
----------------
 true

通过SQL可以查看配置:

postgres=# select * from pg_hba_file_rules;
 line_number | type  |   database    | user_name |    address    |                 netmask                 | auth_method | options | error 
-------------+-------+---------------+-----------+---------------+-----------------------------------------+-------------+---------+-------
          87 | host  | {all}         | {all}     | 192.168.163.0 | 255.255.255.0                           | md5         |         | 
          92 | local | {all}         | {all}     |               |                                         | peer        |         | 
          94 | host  | {all}         | {all}     | 127.0.0.1     | 255.255.255.255                         | md5         |         | 
          96 | host  | {all}         | {all}     | ::1           | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | 
          99 | local | {replication} | {all}     |               |                                         | peer        |         | 
         100 | host  | {replication} | {all}     | 127.0.0.1     | 255.255.255.255                         | md5         |         | 
         101 | host  | {replication} | {all}     | ::1           | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         |

3、实际使用授权示例

#访问库
postgres=# grant connect on database db to aikes;
GRANT
#访问schmea
postgres=# grant usage on schema sche to aikes;
GRANT
#访问表
postgres=# grant select,insert,update,delete on all tables in schema sche to aikes;
GRANT
#如果访问自增序列,需要授权
postgres=# grant select,update on all sequences in schema sche to aikes;
GRANT

注意:上面的授权只对历史的一些对象授权,后期增加的对象是没有权限的,需要给个默认权限

#默认表权限
postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA sche GRANT select,insert,update,delete ON TABLES TO aikes;
ALTER DEFAULT PRIVILEGES

#默认自增序列权限
postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA sche GRANT select,update ON sequences TO aikes;
ALTER DEFAULT PRIVILEGES

4、查看对象权限

通过指令 \dp 或者下列SQL可以查看到数据库对象权限划分

SELECT n.nspname as "Schema",  
  c.relname as "Name",  
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'foreign table' END as "Type",  
  pg_catalog.array_to_string(c.relacl, E'\n') AS "Access privileges",  
  pg_catalog.array_to_string(ARRAY(  
    SELECT attname || E':\n  ' || pg_catalog.array_to_string(attacl, E'\n  ')  
    FROM pg_catalog.pg_attribute a  
    WHERE attrelid = c.oid AND NOT attisdropped AND attacl IS NOT NULL  
  ), E'\n') AS "Column privileges",  
  pg_catalog.array_to_string(ARRAY(  
    SELECT polname  
    || CASE WHEN polcmd != '*' THEN  
           E' (' || polcmd || E'):'  
       ELSE E':'   
       END  
    || CASE WHEN polqual IS NOT NULL THEN  
           E'\n  (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)  
       ELSE E''  
       END  
    || CASE WHEN polwithcheck IS NOT NULL THEN  
           E'\n  (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)  
       ELSE E''  
       END    || CASE WHEN polroles <> '{0}' THEN  
           E'\n  to: ' || pg_catalog.array_to_string(  
               ARRAY(  
                   SELECT rolname  
                   FROM pg_catalog.pg_roles  
                   WHERE oid = ANY (polroles)  
                   ORDER BY 1  
               ), E', ')  
       ELSE E''  
       END  
    FROM pg_catalog.pg_policy pol  
    WHERE polrelid = c.oid), E'\n')  
    AS "Policies"  
FROM pg_catalog.pg_class c  
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace  
WHERE c.relkind IN ('r', 'v', 'm', 'S', 'f')  
  AND n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)  
ORDER BY 1, 2;  
 Schema |              Name              |   Type   |    Access privileges    | Column privileges | Policies
--------+--------------------------------+----------+-------------------------+-------------------+----------
 public | emp    				         | table    | dbuser=arwdDxt/dbuser  +|                   |
        |                                |          | postgres=arwd/dbuser    |                   |
 public | dept         					 | table    | dbuser=arwdDxt/dbuser  +|                   |
        |                                |          | postgres=arwd/dbuser    |                   |
 public | company                   	 | table    | dbuser=arwdDxt/dbuser  +|                   |

其中dbuser=后面跟着的字符就是ACL权限列表定义的对应权限
权限定义

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgre数据库用户权限总结 的相关文章

  • proteus电路仿真设计图中很多器件之间没有实线连线,它们是怎么实现的?

    如题所示 xff0c 在proteus电路仿真设计图中 xff0c 我们发现 xff0c 电子元器件之间 xff0c 很多时候并没有实线连接 xff0c 但是他们却可以工作 对于新手的我们 xff0c 可能觉着很奇怪 xff0c 独立的器件
  • 七段数码管显示原理研究

    在51单片机学习过程中 xff0c 相对基础的一个实验就是利用七段数码管依次显示数字0 9 很多时候 xff0c 我们按照要求 xff0c 搭建了电路 xff0c 编写了对应的显示控制程序 xff0c 最后运行 xff0c 可能对于七段数码
  • Cloudkitty – OpenStack计费服务

    https mp weixin qq com s biz 61 MzU0NDEyODkzMQ 61 61 amp mid 61 2247494964 amp idx 61 1 amp sn 61 259f86891d8e7bc07debd3
  • 51单片机c语言开发工具keil安装

    单片机分好几种 xff0c 常见的51单片机开发需要安装keil对应c51版本 xff0c 不能安装成了mdk版本 这个需要注意 目前 xff0c 比较好的工具 xff0c windows下自然是keil了 但是它是收费的 xff0c 只能
  • 仿真软件proteus构建LCD1602显示字符串实验

    LCD1602模块的显示需要注意几点 xff1a 1 显示两行 xff0c 第一行的起始地址是0x80 xff0c 第二行的地址是0x80 43 0x40 61 0xC0 2 RS RW EN接线没有说一定要接到P1 P2 P3上 xff0
  • 仿真软件proteus点亮led实验

    在这个实验之前 xff0c 确保系统已经正确安装了proteus和keil工具 proteus是用来设计电路图的 xff0c keil是用来编写c语言代码并编译成芯片可用的hex程序的 前面安装keil的时候 xff0c 最后提到 xff0
  • 仿真软件proteus构建七段数码管显示数字0-9实验

    七段数码管显示原理研究在前一篇博客中已经阐述过 xff0c 就是利用7个数码管构建一个 8 字形 xff0c 然后利用数字的形状特点 xff0c 依次点亮某一些段 xff0c 就可以显示数字了 七段数码管显示数字还是二极管发光原理的利用 这
  • 仿真软件proteus构建LCD1602四线驱动实验

    默认的LCD1602都是8线驱动 xff0c 数据口D0 D7都要接线 xff0c 这种方式对于写数据而言 xff0c 很方便 xff0c 不需要考虑太多 但是因为要的数据线过多 xff0c 在实际布线过程中 xff0c 可能会考虑使用四线
  • 液晶显示屏LCD1602直连STC89C52RC单片机程序

    我买的普中 2单片机类型开发板 xff0c 单片机自带有一排插槽 xff0c 是留给LCD1602显示用的 虽然这个插槽正好可以连接上LCD1602 xff0c 但是因为他的引脚特殊性 xff0c 有三个引脚 xff0c RW RS EN需
  • 记录一次单片机芯片插反通电故障

    昨天晚上在家里捣鼓单片机最小系统 xff0c 把开发板上的芯片从卡座上拆下来 xff0c 然后放在面包板上diy最小系统 xff0c 后来放回去 但是我只记着芯片有缺口的地方朝上 xff0c 并没有记住它从卡座上卸载下来的方向 xff0c
  • mac系统安装win10双系统

    一个月前 xff0c 为了在家里学习单片机 xff0c 在mac book air系统基础上 xff0c 安装了win10 xff0c 搞了一个双系统 在安装之前 xff0c 看了很多资料 xff0c 基本上提到两点 xff0c 一个是准备
  • 谐振电路应用之LED交替闪烁

    谐振电路主要利用三极管特性 xff0c 让电路持续交替出现高低电平的现象 xff0c 根据这个特点 xff0c 可以制作LED交替闪烁的效果 谐振电路图如下所示 xff1a 根据这个图 xff0c 可以很方便的利用三极管 xff0c 电阻
  • Python基础-TypeError:takes 2 positional arguments but 3 were given

    Error xff1a 今天写一段简单类定义python代码所遇到报错问题 xff1a TypeError drive takes 2 positional arguments but 3 were given 代码如下 class Car
  • node使用netcat依赖库做socket编程

    node编程里面 xff0c 默认有一个net库可以做socket编程 xff0c 这里要说的是netcat这个库 xff0c 思路都是一样的 xff0c 甚至代码逻辑都很像 netcat可以支持tcp udp xff0c 同时很方便的构造
  • 荔枝派nano初体验-windows写入镜像到TF卡启动

    荔枝派nano是一个很小的系统 xff0c 搭载全志F1C100S芯片 xff0c 具有ddr内存 xff0c 支持tf flash启动 本人在了解荔枝派的特点之后 xff0c 在淘宝上找到了一个57块钱的荔枝派nano xff0c 一般价

随机推荐

  • linux下socket编程中setsockopt的作用

    如题所示 xff0c 在linux进行socket编程的时候 xff0c 一般而言 xff0c socket bind listen三步曲之后 xff0c 就开始接收客户端请求 xff0c 然后实现收发数据 如下所示的代码 xff0c 是没
  • 悲观锁与乐观锁以及如何用java语言和mysql实现

    悲观锁 xff0c 乐观锁跟字面意思一样 xff0c 悲观锁认为在多线程场景下 xff0c 不一定能够获取资源 xff0c 所以要先获取锁 xff0c 再做相关业务 xff0c 保证不会发生冲突 乐观锁认为多线程场景下 xff0c 不会发生
  • opencv结合微信二维码识别功能实现图片二维码识别

    opencv本身有二维码识别功能 xff0c 但是识别效果不是很好 xff0c 它对二维码图片要求较高 xff0c 虽然可以有图片处理 xff0c 甚至抠出二维码区域 xff0c 但是整体识别与微信二维码识别功能还是有差距的 微信二维码识别
  • opencv for java给图片添加水印中文问题

    opencv提供的给图片添加文字的方法Imgproc putText 可以给图片添加文字 xff0c 最后类似一个添加水印的效果 xff0c 但是这个方法对中文支持不好 xff0c 在没有字体支持的情况下 xff0c 默认中文显示 如下图所
  • springboot文件上传大小限制设置

    一般的web系统基本都会有文件上传功能 xff0c 文件上传必然涉及到一个问题 xff0c 就是文件大小 xff0c 太大的文件不仅传输速度慢 xff0c 而且对服务器压力巨大 xff0c 后期的下载和保存都是一种考验 所以有了文件大小限制
  • springboot打包后资源文件读取问题

    springboot项目打包之后 xff0c 将所有依赖都打入jar包 xff0c 同时也将系统中要使用的一些资源文件也会打进来 xff0c 之后运行这个jar包 xff0c 里面包含的资源文件不能再像文件系统那样直接在classpath下
  • navicat导入外部数据到mysql中文乱码以及日期格式问题

    最近在使用navicat导入外部数据到mysql中总结了以下几个问题 xff1a 1 中文乱码 xff0c 这个是因为数据在csv或者excel中格式是ANSI 格式 比如csv的数据内容如下 xff1a 在导入向导这里就乱码了 xff1a
  • opencv for java实现人脸检测

    opencv是一个很优秀的图像处理框架 xff0c 可以通过源码编译 xff0c 让他支持java开发 xff0c 这里如果在windows下开发 xff0c 可以直接使用opencv 453 jar和opencv java452 dll动
  • 网络测试工具netperf

    一般我们进行网络测试 xff0c 主要是测试网络的连通性 网络带宽 网络响应时间等 常用的工具包括ping traceroute telnet ftp等 如测试网络连通性 xff0c 可以使用ping xff0c traceroute xf
  • mybatis使用collection嵌套查询

    在开发中 xff0c 可能会遇到一对多的关系 xff0c 这个时候 xff0c 一条sql语句就难以胜任这个任务了 只能先执行一条sql xff0c 然后根据返回的结果 xff0c 再做一次sql关联查询 xff0c 这个时候 xff0c
  • java通过流读取图片做base64编码

    在web页面上 xff0c 显示图片 xff0c 一般是给出图片地址 xff0c 然后以url的方式显示 xff0c 但是有一些特殊情况 xff0c 如果我们的图片保存在ftp服务器上 xff0c 不能外部轻易访问 xff0c 但是可以通过
  • tesseract-ocr+java实现图片文字识别

    ocr是Optical Character Recognition的简写 xff0c 就是光学字符识别技术 主要是对包含文本资料的图片进行识别 xff0c 获取文本信息的技术 目前tesseract ocr这个工具可以很方便的在Window
  • mysql使用join做update操纵与使用join做查询时出现重复记录的问题

    在实际处理数据过程中 xff0c 有一些数据可能会从别的地方导入过来 xff0c 两个表有关联 xff0c 但是一个表中的某一列缺失 xff0c 如果要补全 xff0c 可以利用另一个表来做填充 这里就是今天的第一个问题 xff0c 使用u
  • mac系统上通过源码编译安装opencv for java

    本人在Mac系统上尝试下载opencv源码 xff0c 然后通过cmake make make install命令编译安装 xff0c 都失败 xff0c 各种依赖缺失报错 最后通过brew install build from sourc
  • vmware安装苹果虚拟机卡在苹果图标位置不动

    计算机环境 xff1a vmware16 2 xff0c win11 xff0c macos 12 monterey xff0c macos majave 如题所示 xff0c 在vmware里面安装苹果虚拟机 xff0c 通过unlock
  • docker搭建fastdfs环境

    fastdfs是一个开源的分布式文件系统 xff0c 在实际使用中 xff0c 通过源码编译安装过程非常复杂 xff0c 但是通过docker快速构建却非常容易 下面介绍通过docker安装fastdfs的方法 docker镜像的选择也挺重
  • springboot项目结合fastdfs做文件上传

    前面一篇博客介绍通过docker构建fastdfs xff0c 并且在storage容器中通过fdfs upload file命令成功上传了一个文件 xff0c 最后通过http ip 8888 group path访问到了文件 xff0c
  • Kernel panic - not syncing: IO-APIC + timer doesn‘t work解决办法

    如题所示 xff0c 我在使用qemu system x86 64模拟器启动linux内核与busybox根文件系统组成的虚拟机的时候报错 xff0c 系统无法正常开启 xff0c 运行截图如下 xff1a 这里说的是apic和时钟无法工作
  • ubuntu源码编译busybox与linux内核并使用qemu-system-x86_64模拟启动

    busybox 1 35 0 https busybox net downloads busybox 1 35 0 tar bz2 sudo apt install make gcc libncurses dev 编译配置 xff1a 在b
  • Postgre数据库用户权限总结

    1 故事起源 我们的项目使用了PG数据库 xff0c 在项目开发阶段 xff0c 为了省事偷懒 xff0c 直接将应用连接数据库的用户给了supperuser权限 xff0c 用起来简直不要太爽 随着开发进度接近中后期 xff0c 开始筹建