基于钉钉 + Virtual-LDAP + KeyCloak 的内网统一认证系统

0. 架构

基于钉钉的内网统一认证

1. 背景

最近公司内网的各种系统部署得越来越多,每个系统都有自己的认证方式和账号体系,这导致大家在每个地方都要去注册一个账号,并且不利于公司统一管理密码安全策略,例如密码到期策略、密码复杂度策略以及强制二次验证等。

以及对于一部分短平快的内网应用来说,我们并没有时间去为它开发一套用户体系,这个时候还是希望能有一个统一的前端反向代理来处理用户认证这个流程。

为此,我就去寻找了一些解决方案,并且为了解决开源系统并不能对接外部用户系统的问题,开发了一个 Node.JS Package(Virtual-LDAP)来提供 LDAP 能力。

2. 问题

虽然总的需求是一个很简单的功能,但是这其中还是有很多细节的问题需要考虑。

认证方式

对于有一些开源系统,它本身是支持 OAuth 来进行用户认证的,这个时候只需要去选择一个支持 OAuth 的用户管理系统就可以了,甚至基于开源库自己去开发一个也并不困难。但是对于某一些开源系统来说,它并没有提供 OAuth 认证接入的支持,只提供了 LDAP 接入。

例如最近我们引入了 Metabase 作为面向运营的快速 BI 分析工具,但是它除了可以接入 Google 账号作为认证方式,就只能接受 LDAP 作为认证方式了。这个时候就得去寻找一个认证系统,同时能支持 OAuth 以及 LDAP。

用户体系

引入用户管理系统之后,还有另外一个问题需要考虑,就是现在员工的用户体系需要去管理。对于一个小公司来说,目前并没有一个统一的工具去同时管理员工的各种信息以及状态。

但是目前公司已经引入钉钉作为公司的交流沟通工具,以及作为各种流程的审批处理系统,HR 也会在钉钉上去管理所有员工的状态,以及员工的组织架构。

因此,这个用户管理系统最好需要能支持同步钉钉中的用户体系,这样就不需要额外的人力去维护用户管理系统,以及在有员工状态变更的时候,能及时同步,避免出现授权外的访问。

数据同步

有了 OAuth,有了 LDAP,还有了钉钉这个数据源,因此就需要处理好各个 Provider 之间的数据同步问题,避免人工去维护各个系统里面的用户数据,做到以钉钉的数据为基础,用户管理系统提供能力,做到各个系统各个认证方式得到的用户数据都是一致的。

以及,对于 …

阅读全文 »

另外一些胶片

对一个宅来说,热情果然很容易消退,胶卷的消耗速度是越来越慢。

再一次,胶片摄影

Nikon FE

也不能叫摄影,就是拍拍照。

数码相机还没有玩明白呢,不知道为什么突然想玩胶片了。

上一次用胶片,已经记不得是什么时候了,用的应该是国产的傻瓜机,拍一卷的成本也特别高。

后来了解了一下现在的胶片相机,找到一个佳能 EOS 10 QD,成色特别好的竟然也很便宜,配上朋友送的 50/1.8,入门无压力。

EOS 10 QD

到手之后,装上胶卷,切换到 A 档,半按快门自动对焦,自动测光,按下快门自动过片,使用起来跟数码相机并没有太多区别。

除了对焦点少一点,和不能马上回放。

一开始总觉得,每按一次快门,都是有成本的,所以特别珍惜,虽然一卷只有 36 张,还是用了很久的时间才拍完。

拍完之后,赶紧上淘宝找冲洗的店家,赶紧打包,赶紧叫来快递,把胶卷寄出去。

在等待店家把冲洗扫描后的照片传回的时候,就跟感觉在等待彩票开奖一样,有没有对上焦?快门准不准?胶卷装得对不对?

幸好自动的机器还是挺保险的,收到照片时,36 张还是 36 张,除了有些对焦点选错了,基本上都还能看。

虽然富士 SP3000 扫描评价很低,但是还是想感受一下,这个胶卷配上这个扫描仪,是个什么感觉。

Ants

Starbucks

生日花牌

Lotus

荷花池

既然能出片了,就想着试试其他的,总觉得如果一直用自动的机器,为什么不直接用数码相机呢。

在看了很多年代更久远一点的相机之后,对那种金属质感难以释怀。看了很多文章之后,对比了一下,最终选择了这款:

Nikon FE

Nikon FE,手动对焦,带光圈优先模式,最高快门速度 1/1000 秒,磨砂裂象对焦。

至于结果嘛,就只能等下一次开奖咯。

Garmin vivosmart 4 使用体验

Garmin vivosmart 4

缘由

在去年秋天,我突然觉得不能继续放肆下去,需要对体能和体形进行更好的改善,刚好公司的健身房也算是设施完善,因此首先就开始了通过有氧来进行减脂的训练。

作为一个器材党、数据党,在运动的时候怎么能没有一个设备来记录训练数据呢,不管是运动的时长、距离,还是心率的波动,都是我需要关注的。

经验

在为自己购买智能手环或手表设备之前,我已经给家里人买过几款智能手环以及试用过几款智能手环或手表:

  • 荣耀手环 4
  • 米动手表青春版
  • 米动手环
  • Amazfit 智能运动手表 2S

作为一个戴配饰会死星人,我完全不能接受特别大特别重的智能手表类设备,特别是作为一个码农,在敲键盘的时候还有一个手表来哐当哐当敲着键盘托的位置,简直难以忍受。

在试用了 Amazfit 智能运动手表 2S 之后,就直接放弃了使用手表类设备的念头。秋天已经穿上长袖甚至外套,一个又厚又宽大的手表简直是穿衣脱衣的巨大障碍。

在试用了米动手环之后,发现那个屏幕的表现实在是有些差劲,颗粒感太明显,放弃。

米动手表青春版其实感受还不错,反显常亮表盘,日常使用足够,续航足够长,还带 GPS,并且本身重量体积很轻很薄,但是在使用过小米运动这个 App 之后,完全没有想要使用的想法。

荣耀手环的屏幕很惊艳,几乎没有颗粒感,但是华为运动健康 App 也是跟小米运动一样,在运动数据记录方面不够专业。

并且在使用过程中,不管是小米运动,还是华为运动健康,甚至于苹果的 Health App,都没有能提供一个运动记录的详细数据,以及提供一个除了手机之外更方便查看运动记录的 Web 或者桌面 App。

选择

作为一个 Garmin 老用户,这个时候自然会想到在运动设备领域足够专业的 Garmin 有没有提供什么设备可供选择。

在选择设备的时候,有几个功能点是我需要考虑的:

  • 续航能力
  • 是否支持 GPS
  • 是否支持全天心率监测
  • 是否防水
  • 是否支持游泳或力量训练
  • 佩戴是否舒适

在 Garmin 的运动休闲分类中挑了好久之后,找到三个备选:

  • vivosmart


阅读全文 »

阿里云 IoT LinkDevelop 案例实战

阿里云 IoT 在 3 月份的时候发布了 Link Develop 一站式开发平台,我根据平台的文档,编写了几个示例,便于外部开发者们来快速理解和掌握怎样使用 Link Develop 平台去加速和辅助物联网产品的开发工作。

示例包括空气监测站、智能灯、Home Assistant 设备接入等,涉及的技术包括 Arduino、React、iOS、前端开发等。

通过这个文档,可以快速了解 Link Develop 一站式开发平台所提供的功能,以及怎样基于平台实现一个物联网产品。

文档配套示例代码同样提供在 GitHub 中。

目录:

GitHub 地址:

https://github.com/aliyun-linkdevelop/linkdevelop-practice

https://github.com/aliyun-linkdevelop/airmonitor_demo

https://github.com/aliyun-linkdevelop/smartlight_demo

玩玩智能家居8:搭建基于 Grafana 的环境数据看板

在之前的文章 《玩玩智能家居4:InfluxDB & Grafana》 已经介绍了怎么将 Domoticz 中采集到的数据存储到 Influxdb,以及使用 Grafana 来查看数据,但是这样只有一个两个数据,并不能很方便的对整个家里的环境数据有个快速了解。

Grafana 提供了丰富的面板组件,可以以各种形式来展示数据,例如文本和曲线图,而且也可以很方便地自定义阈值,对于数据的不同数值显示不同的颜色,或者不同的背景颜色,这样便于了解当前数据是否处于能接受的范围内。

借助于 Grafana 这些组件,就可以很方便的搭建一个属于自己的家庭环境数据看板了。

玩玩智能家居7:Domoticz 中的 Events

在使用 Domoticz 的过程中,为了避免让 Domoticz 只是成为一个手机上的遥控器,就需要根据生活使用场景去定制一些自动化的规则,例如在天黑回家时自动打开灯,又或者是在睡觉之后自动关闭不必要的灯,在这个时候,就需要使用 Domoticz 的 Events 系统了。

Domoticz 的 Events 支持很多种类语言的编码,其中还包括图形化的配置工具 Blockly。

当然这里并不会去介绍 Blockly 的配置方式,因为使用编码的方式可以得到更细粒度的控制,以及更自由的场景条件控制。

这里主要介绍一些处理事件时的技巧和思路。

时间差处理

在事件处理过程中,最重要的一件事就是判断事件发生的时间与当前时间的时间差,通过这个时间差,可以很方便的根据不同的时间差来达到不同的目的。

now = os.date('*t')

function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 


阅读全文 »

玩玩智能家居6:接入杜亚电动窗帘

之前还没有玩上 Domoticz 的时候,家里全套系统都是用的 Broadlink,在买窗帘的时候也想着要买电动的,因此很自然的买了支持 Broadlink 的杜亚窗帘电机,可以方便地与 Broadlink 的传感器进行联动。

后来用了 Domoticz,但是 Broadlink 的系统并没有开放 API,想要接入 Domotiz 系统就比较麻烦了。在网上看了一堆帖子之后,发现可以通过分析窗帘电机遥控器信号,然后自己使用 433M 射频模块来自己控制。

Controlling Blinds.com RF Dooya Motors with Arduino and Vera 这篇帖子中提供了一个 PDF,详细介绍了如何嗅探信号,以及杜亚窗帘电机遥控器信号的格式。

准备材料

发射和接收 433M 射频信号需要的材料很简单,只需要 433M 发送和接收模块就可以了,不超过 5 块钱。

再加上需要接入 Domoticz,加个 NodeMCU,完事。

嗅探信号

首先需要嗅探一下窗帘遥控器发出的信号,如果有专业的机器的话可以直接去嗅探 433M 射频信号,如果没有的话,也可以使用 433M 模块自制一个。

根据前面提到的 PDF 中介绍的方法,将一个 433M 模块与 …

阅读全文 »

玩玩智能家居5:DIY水浸传感器

之前总是担心厨房水槽下水管会漏水,所以直接用雨水传感器做了一个水浸传感器,这样在漏水的时候,就可以直接收到通知,从而及时去检查并修复下水管漏水问题。

要 DIY 一个水浸传感器还是很简单的,只需要一个雨水传感器和一个 NodeMCU 就可以了。

雨水传感器

给 NodeMCU 刷上 ESPEasy,配置一个 Switch 设备,将 GPIO 设置为 NodeMCU 与雨水传感器 DO 针脚连接的 IO 就可以了。

然后再在 Domoticz 中配置好一个 Virtual Sensor,类型改为 Switch 就可以了。

报警声音

有些时候推送通知会比较慢,又或者手机不在身边,那么是否可以直接在 NodeMCU 这一端直接使用声音报警呢?这很简单,加个蜂鸣器模块,再写点代码就好了。

先给 ESPEasy 写个蜂鸣器插件,关键代码就是使用 Arduino 的 tone 函数了:

#define Plugin158_Do 262
#define Plugin158_Re 294
#define Plugin158_Mi 330
#define Plugin158_Fa 


阅读全文 »

玩玩智能家居4:InfluxDB & Grafana

在接入了很多传感器到 Domoticz 之后,终于可以全面监控家里的各种环境参数了,例如温度、湿度、PM 2.5、二氧化碳浓度等等。

Domoticz 虽然已经自带了传感器数据日志,但是一来详细数据最多只能保存七天,二来只能单独查看每个传感器的数据,而不能将多个传感器数据放在一起对比查看,所以就需要使用其他方式去保存和展示传感器历史数据。

InfluxDB

InfluxDB 是一个时序数据库,很方便用来保存时间序列数据,而各种传感器数据其实就是一个时间序列化数据,InfluxDB 的介绍页面也说了很适合于 IoT Sensors 数据的保存。

使用 InfluxDB 最方便的方式就是用 Docker 了,直接在 DSM 的 Docker 中添加 influxdb 镜像,然后启动一个容器就可以了。

当然这里要记得添加一下端口映射,后面在配置 Domoticz Data Push 的时候需要用到。

Domoticz Data Push

部署好了 InfluxDB,就可以在 Domoticz 里面配置把接收到的传感器数据同时推送到 InfluxDB 中保存了。

Domoticz 提供了两种方式可以用来将传感器数据推送到 InfluxDB 中,一种使用 HTTP 调用 InfluxDB 的 HTTP API,还有一种是直接使用 Domoticz 内建的 …

阅读全文 »