hive插件 ranger_Apache Ranger及Hive权限控制

一、Ranger概述

1.Ranger简介

Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。

本文章介绍Ranger与Hive集成过程,与使用方法

2.Ranger包含以下组件

Ranger Admin 用户管理策略,提供WebUI和RestFul接口

Ranger UserSync 用于将Unix系统或LDAP用户/组同步到RangerAdmin

Ranger TagSync 同步Atlas中的Tag信息

Ranger KMS

000.jpg

3.Ranger依赖的组件:

JDK 运行RangerAdmin RangerKMS

RDBMS 1.存储授权策略 2.存储Ranger 用户/组 3.存储审核日志

Solr(可选) 存储审核日志

HDFS(可选) 存储审核日志

Kerberos(可选) 确保所有请求都被认证

4.目前Ranger0.7支持的Plugin

HDFS

YARN

SOLR

ATLAS

HBASE

KNOX

KAFKA

HIVE

STORM

NIFI

二、Ranger编译安装

说明: Ranger可以在Ambari上直接安装。开启AmbariHivePlugin也可以直接在页面上操作。

但如果跟ApacheHive集成的话,需要先编译出ApacheRanger的HivePlugin来

1.Apache Ranger编译

#Install maven git gcc mysql

git clone https://github.com/apache/ranger.git

cd ranger

git checkout release-ranger-0.7.1

mvn clean compile package assembly:assembly install -DskipTests

ls target

2.通过Ambari安装Ranger

前置条件:

1.必须有 MySQL/Oracle/Postgres/MSSQL/SQL Anywhere Server 数据库实例

2.在RangerAdmin主机上 必须安装DB Client

3.确保DB Admin用户可以再其他机器上登陆(用来创建ranger用户)

4.执行下面的命令 导入JDBC驱动 ambari-server setup –jdbc-db={database-type} –jdbc-driver={/jdbc/driver/path}

#导入JDBC驱动:

#(MySQL JDBC Driver Jar包下载页面:https://dev.mysql.com/downloads/connector/j/5.0.html)

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.0.8.tar.gz

tar -zxvf mysql-connector-java-5.0.8.tar.gz

ambari-server setup --jdbc-db=mysql --jdbc-driver=mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar

3.安装RangerHivePlugin

登陆RangerAdmin: http://l-node1.data.beta.cn0:6080

#AmbariHive可直接在Ambari页面上操作

#ApacheHive的话 需要执行以下命令:

# 1.拷贝RangerHivePlugin安装包

cp target/ranger-0.7.1-hive-plugin.tar.gz /usr/apache

tar -zxvf /usr/apache/ranger-0.7.1-hive-plugin.tar.gz

# 2.编辑install.properties文件

#编辑POLICY_MGR_URL 指向RangerAdmin 例如 POLICY_MGR_URL=http://l-node1.data.beta.cn0:6080

#编辑REPOSITORY_NAME 要与RangerAdmin中ServiceName配置一致 例如 REPOSITORY_NAME=hivebeta

vim /usr/apache/ranger-0.7.1-hive-plugin/install.properties

# 3.配置JAVA_HOME HIVE_HOME 环境变量

echo "export JAVA_HOME=/usr/java/jdk1.8.0_141" >> /etc/bashrc

echo "export HIVE_HOME=/usr/apache/hive" >> /etc/bashrc

source /etc/bashrc

# 4.开启plugin

sudo sh /usr/apache/ranger-0.7.1-hive-plugin/enable-hive-plugin.sh

#显示Ranger Plugin for hive has been enabled. Please restart hive to ensure that changes are effective.即成功

# 5.重启HiveServer

4.RangerAdmin上面配置要管理的HiveServer实例

001.png

002.png

三、Ranger Hive权限控制

1.准备测试数据

点击hivebeta 开始Hive权限控制

003.png

根据我们刚才的配置,hive用户拥有all权限

使用beeline登陆

[hive@l-node3 hive]$ bin/beeline

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Beeline version 2.3.0 by Apache Hive

beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: hive

Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:

17/08/03 11:49:28 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000

Connected to: Apache Hive (version 2.3.0)

Driver: Hive JDBC (version 2.3.0)

Transaction isolation: TRANSACTION_REPEATABLE_READ

#创建ranger测试库

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> create database ranger_test_db;

No rows affected (0.259 seconds)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

No rows affected (0.114 seconds)

#创建测试表

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user

. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)

. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED

. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'

. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;

No rows affected (0.317 seconds)

# 表数据

[hive@l-node3 hive]$ hadoop fs -cat /tmp/t_user.data

meizi 18518760001

xuaner 18518760002

afa 18518760003

hanze 18518760004

xupeng 18518760005

xiaofeng 18518760006

shuoshuo 18518760007

# 导入数据

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> LOAD DATA INPATH '/tmp/t_user.data' INTO TABLE t_user;

No rows affected (0.523 seconds)

#查询成功

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 18518760001 |

| xuaner | 18518760002 |

| afa | 18518760003 |

| hanze | 18518760004 |

| xupeng | 18518760005 |

| xiaofeng | 18518760006 |

| shuoshuo | 18518760007 |

+--------------+---------------+

7 rows selected (0.11 seconds)

2.HiveAccess(对库、表、列的授权)

# 在Ranger UserSync机器上创建测试用户rangeruser1

[root@l-node1 ~]# useradd rangeruser1

# 测试未授权的用户

[hive@l-node3 hive]$ bin/beeline

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Beeline version 2.3.0 by Apache Hive

beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

#使用rangeruser1用户登陆

Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: rangeruser1

Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:

17/08/03 12:30:58 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000

Connected to: Apache Hive (version 2.3.0)

Driver: Hive JDBC (version 2.3.0)

Transaction isolation: TRANSACTION_REPEATABLE_READ

# use db; select table; 等访问全部被拒绝

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [USE] privilege on [ranger_test_db] (state=42000,code=40000)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from ranger_test_db.t_user;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [SELECT] privilege on [ranger_test_db/t_user/*] (state=42000,code=40000)

给rangeruser1用户授权

点击Add New Policy给rangeruser1用户授予ranger_test_db.t_user.* select权限

004.png

#select成功

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

No rows affected (0.127 seconds)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 18518760001 |

| xuaner | 18518760002 |

| afa | 18518760003 |

| hanze | 18518760004 |

| xupeng | 18518760005 |

| xiaofeng | 18518760006 |

| shuoshuo | 18518760007 |

+--------------+---------------+

7 rows selected (0.12 seconds)

#删除表 被拒绝

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> drop table t_user;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [DROP] privilege on [ranger_test_db/t_user] (state=42000,code=40000)

#创建表 被拒绝

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user2

. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)

. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED

. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'

. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [CREATE] privilege on [ranger_test_db/t_user2] (state=42000,code=40000)

Delegate Admin(委托管理员)说明: 如果一个Condition中的 用户/组 为Delegate Admin,那么该 用户/组 可以修改上面resource的权限 并可以把此resource授权给其他人

也可以使用SQL进行授权(授权过的记录同样会显示在RangerAdmin上):

GRANT SELECT ON TABLE ranger_test_db.t_user TO USER fengjie;

3.Masking(动态列屏蔽)

动态列屏蔽: 可以将一列数据进行屏蔽操作 如哈希、加密、打马赛克等

添加一个Masking Policy

005.png

006.png

Select Masking Option里面填Mask的选项,默认有: 显示前4位、显示后4位、哈希、Null值、日期类型仅显示年等。我们这里使用Custom自定义,

其实就是写Select子句 可以根据逻辑自己实现,也可使用UDF。本例中我们使用concat(substr(phone,1,7),'****')将手机号的后四位屏蔽掉

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 1851876**** |

| xuaner | 1851876**** |

| afa | 1851876**** |

| hanze | 1851876**** |

| xupeng | 1851876**** |

| xiaofeng | 1851876**** |

| shuoshuo | 1851876**** |

+--------------+---------------+

7 rows selected (0.173 seconds)

4.Row Level Filter(行级别过滤)

行级别过滤: 可以过滤掉行数据。比如订单表,北京的员工仅允许看北京的订单数据,其他地区的数据被强制过滤掉

添加一个Row Level Filter Policy

007.png

008.png

Row Level Filter里面填Filter的过滤规则,其实就是写Where子句。本例中我们使用name <> 'hanze'将 name为’hanze’的用户过滤掉

#hanze用户已经被过滤掉,不显示在结果中了

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 1851876**** |

| xuaner | 1851876**** |

| afa | 1851876**** |

| xupeng | 1851876**** |

| xiaofeng | 1851876**** |

| shuoshuo | 1851876**** |

+--------------+---------------+

6 rows selected (0.164 seconds)

四、基于TAG的权限控制

Apache Ranger可以和Apache Atlas(数据治理,元数据仓储)组件一起使用,它可以定义一种基于标签的安全服务,通过使用标签对文件和数据资产进行分类,并控制用户和用户组对一系列标签的访问。

Apache Atlas里面可以对资源打Tag。打了Tag后 我们可以在这里根据Tag来控制权限

(注意:因需要集成Atlas 此功能暂未验证)

1.添加TagService

009.png

010.png

2.添加TagPolicy

011.png

012.png

上图的Policy,实现了这样的场景:

产品组(product)可以访问带”TAG”标签的资源; 但实习生(intern)不靠谱 实习生没有访问权限; 但因实习生中的meizi表现突出 给他赋予访问权限

3.授权流程:

013.png

先检查基于Tag的权限是否拒绝,如果拒绝的话,报错退出。

如果不拒绝,再检查基于Resource的权限拒不拒绝。

如果不拒绝,再检查Tag的权限允不允许,Resource的权限允不允许。

五、Audit审计记录

1.Access

此页面记录每次授权的信息 包括策略id、时间、访问用户、访问的资源、访问的类型、授权结果等信息。可以根据条件进行搜索

开启此功能需要先安装Solr

014.png

2.Admin

此页面记录对策略的操作

015.png

3.Login Sessions

此页面记录登陆RangerAdmin的操作

016.png

4.Plugins

记录Plugins的同步策略

017.png

5.Pugins Status

Plugin的状态

018.png

六、RestAPI

以上在RangerAdminWeb上操作的东西 都可以在RestAPI里面操作。

比如 添加服务、更新服务、删除服务、搜索服务、获取策略、创建策略、更新策略、删除策略、搜索策略等

API name Create Policy

Request Type POST

Request URL service/public/v2/api/policy

Request Parameters Application/json

Hive Example:

{

"policyName": "FinancePolicy",

"databases": "finance,hr",

"tables": "invoices,emps",

"columns": "amt, emp_id",

"udfs": "",

"description": "Hive Policy",

"repositoryName": "hivedev",

"repositoryType": "hive",

"tableType": "Exclusion",

"columnType": "Inclusion",

"isEnabled": true,

"isAuditEnabled": true,

"permMapList": [

{

"userList": [

"john",

"andrew"

],

"permList": [

"Write",

"Admin"

]

},

{

"userList": [

"hr"

],

"groupList": [

"admin"

],

"permList": [

"Read",

"Write",

"Admin"

]

}

]

}

参考文档

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

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

相关文章

openssl编程-基础知识-OpenSSL简介

参考链接 在ubuntu环境下执行openssl编译和安装_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL编程 赵春平 OpenSSL 简介 它提供的主要功能有&#xff1a;SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编…

linux修改文件句柄数生效_linux系统层面调优和常见的面试题

linux系统层面调优和常见的面试题​mp.weixin.qq.com无论对Spark集群&#xff0c;还是Hadoop集群等大数据相关的集群进行调优&#xff0c;对linux系统层面的调优都是必不可少的&#xff0c;这里主要介绍3种常用的调优&#xff1a;1.linux文件句柄linux在整个系统层面和单个进程…

openssl编程-基础知识-OpenSSL堆栈

堆栈介绍 堆栈是一种先进后出的数据结构openssl 大量采用堆栈来存放数据。它实现了一 个通用的堆栈&#xff0c;可以方便的存储任意数据它实现了许多基本的堆栈操作&#xff0c;主要有&#xff1a;堆栈拷贝(sk_dup)、构建新堆栈&#xff08;sk_new_null&#xff0c;sk_new&…

小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV

不同手机品牌都有着自己不同的定位人群&#xff0c;在国内市场目前几大非常有名的手机品牌分别被三星、苹果、华为、小米、OV占据&#xff0c;而这些手机品牌的主要购买人群到底是什么样的呢&#xff1f;企鹅智库近日发布了一份手机消费者的调研报告&#xff0c;并且根据消费者…

国密gmtls协议-双证书体系的服务端和客户端通信代码

内容介绍 国密的双证书体系&#xff0c;将证书按照使用目的的不同划分为加密证书和签名证书两种&#xff0c;也就是两对公私钥&#xff0c;二者本质一致&#xff0c;均为SM2密钥对&#xff0c;区别仅体现在用法国密CA体系中&#xff0c;加密密钥对由CA产生&#xff0c;签名密钥…

jwt 私钥_什么是 JSON Web Token(JWT)

有关本文档的快速链接&#xff0c;请参考页面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作为一个开放的标准 (RFC 7519) 定义了一种简洁自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为有数字签名&#xff0c;所以这些通信的信息能够被校验…

server和client之间进行Socket通信,进行数据切片

参考链接 send函数和recv函数 – gudakos memo 注意事项 代码很low&#xff0c;主要看封装的Send函数所体现的切片思想即可 server代码 //udp服务端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天线下倾角示意图_常用天线和无源器件技术参数汇总

原标题&#xff1a;常用天线和无源器件技术参数汇总一、天线原理天线的定义&#xff1a; 能够有效地向空间某特定方向辐射电磁波或能够有效的接收空间某特定方向来的电磁波的装置。天线的功能&#xff1a; 能量转换-导行波和自由空间波的转换; 定向辐射(接收)-具有一定的方向性…

制作作品图片_不懂人文后期制作流程?来,大师手把手教你

制作前1、处理一张照片思路决定步骤 想要了解学习的老师可以私聊小编fzhdyx222制作后2、2020年最新Camera Raw局部影调和色调的控制想要了解学习的老师可以私聊小编fzhdyx222制作前3、2020年最新Camera Raw基础工具细节性运用想要了解学习的老师可以私聊小编fzhdyx222制作后4、…

xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?

最近我重装了系统(Win10Office2016)&#xff0c;然后发现了一个奇怪的bug&#xff1a;双击xlsx文件&#xff0c;只能打开Excel窗口&#xff0c;但是打不开这个文件&#xff0c;有时候再次双击就能打开了&#xff0c;但有时再次双击也不管用&#xff0c;需要在Excel的菜单中点“…

gmssl使用双证书双向认证的gmtl协议报错crypto/sm2/sm2_sign.c 510: sm2_do_verifySSL3 alert write:fatal:decrypt error

报错内容 crypto/sm2/sm2_sign.c 510: sm2_do_verify SSL3 alert write:fatal:decrypt error SSL_accept:error in error ERROR 140655864152064:error:1417B07B:SSL routines:tls_process_cert_verify:bad signature:ssl/statem/statem_srvr.c:2941: 相关内容 版本&#xf…

纠偏的意思_承压能力和纠偏能力,决定成长的高度

承压能力&#xff0c;包含抗压能力、抵御能力&#xff0c;担当能力&#xff0c;分解能力&#xff0c;消化能力&#xff0c;释放能力&#xff0c;等一系列的精神要素&#xff0c;是一个人生存生活工作中一项重要的素质。有的人&#xff0c;承压能力很强&#xff0c;无论经受什么…

《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较

面向对象和函数式编程的混合&#xff1a;Java 8和Scala的比较 Scala是一种混合了面向对象和函数式编程的语言。它常常被看作Java的一种替代语言&#xff0c;程序员们希望在运行于JVM上的静态类型语言中使用函数式特性&#xff0c;同时又期望保持Java体验的一致性。和Java比较起…

函数指针作为形参进行调用

代码 两个代码均位于namespace作用域之内addOne将传递进来的形参进行加一&#xff0c;然后返回performance_test函数主要是想简化函数调用&#xff0c;两个形参&#xff0c;第一个表示循环的次数&#xff0c;第二个是带参数的函数指针&#xff0c;函数内部初始化start和end两个…

python中fetchall_Python连接MySQL并使用fetchall()方法过滤特殊字符

来一个简单的例子&#xff0c;看Python如何操作数据库&#xff0c;相比Java的JDBC来说&#xff0c;确实非常简单&#xff0c;省去了很多复杂的重复工作&#xff0c;只关心数据的获取与操作。准备工作需要有相应的环境和模块&#xff1a;Ubuntu 14.04 64bitPython 2.7.6MySQLdb注…

《Java8实战》笔记(16):结论以及Java的未来

结论以及Java的未来 回顾Java8的语言特性 行为参数化&#xff08;Lambda以及方法引用&#xff09; 流 CompletableFuture Optional 默认方法 Java的未来 集合 类型系统的改进 声明位置变量 更多的类型推断 模式匹配 更加丰富的泛型形式 具化泛型 泛型中特别为函…

解决吉大正源(身份认证网关|USBKey)和gmssl(server|client)使用gmtl协议交叉互通报错tlsv1 alert decrypt error

报错内容 SSL_connect:error in SSLv3/TLS write finished140057291788288:error:1409441B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error:ssl/record/rec_layer_s3.c:1385:SSL alert number 51 报错原因 gmssl库生成 certificate verify 消息时&#xff0c;对自客…

12无法使用otg_12个冷知识:或许只能看看而无法使用,但却真实存在着

12个或许只能看看而无法使用&#xff0c;但却真实存在着。脸红一所有已知动物中&#xff0c;唯一可以脸红的是人类。二有些地区将雨水归类为公共财物&#xff0c;作为公共财物是不允许收集的&#xff0c;违反者将面临处罚。三世界上汽车研发成本最高的一款车是福特蒙迪欧&#…

《Java8实战》笔记汇总

《Java8实战》笔记&#xff08;01&#xff09;&#xff1a;为什么要关心Java8 《Java8实战》笔记&#xff08;02&#xff09;&#xff1a;通过行为参数传递代码 《Java8实战》笔记&#xff08;03&#xff09;&#xff1a;Lambda表达式 《Java8实战》笔记&#xff08;04&…

三目运算符_C语言知识点:运算符的优先级和结合性

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C语言内置了丰富的运算符&#xff0c;大体可分为10类&#xff1a;算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。根据运算符可操作…