0X00 前言
上周在新公司接到的一个任务"给 XXX 系统集成 LDAP 登录"。我以前是没有了解过 LDAP 的,一听是集成登录功能,脑子里第一时间想到的就是之前做过的 SSO,但是经过一番搜索发现 LDAP 和 SSO 完全是两回事,而且发现还是不少人不了解其中的一项或两项技术,正好在这儿整理一下顺便分享给大家~
内容都是比较基础的,主要介绍了什么是 SSO、SSO 的基本原理、什么是 LDAP、LDAP 的基本原理和 LDAP 如何与 SSO 关联。如果你对这些有兴趣那不妨继续看下去,如果你都了解了那就去看看其他文章或者休息一会儿好了~
现在开始做一些技术背景预设:假设你公司有 10 个站点,分别是site_0.just666.com/site_1.just666.com.....,同时每个站点都有用户系统,也就是说用户可以登录到站点上去做些操作。
用户肯定不愿意访问每个站点的时候都要登录,比如你登陆淘宝之后再看天猫肯定不想再登陆一次了,如果天猫要你再登陆一次且密码还跟淘宝那边不通你肯定要骂人了。现在怎么办呢?SSO 和 LDAP 两种技术就是用来解决这个问题的。
0X01…
0X00 前言
都说“生活需要仪式感“,那对我来说的第一次跳槽还是值得记录的,用处肯定是没什么,但是总归是给自己一点点生活上的仪式感吧。而且脑子记住的东西可能过几年就忘记了,真正记录成文字的东西存活时间就会长久很多。(记录在网络上就算我自己把博客删了,都还会有垃圾站原封不动的抄走,简直不可能丢🤣)
本来说离职当天就来写这篇文章的,结果当天晚上同时请客去吃饭又去唱了歌,回家都凌晨两点了,隧作罢。现在离职手续全部都办好了,新公司的文件们也都准备好了,就等假期过后直接到新公司入职。所以也终于有时间坐下来不用考虑工作相关的任何事情来写一写自己的想法了~
这不是日记,按蓝青峰跟朱潜龙的说法正经人谁写日记啊🤪 (狗头)
0X01 为什么离开
从我以实习生的身份加入创宇到最后离开一共是 1159 天,算下来是三年多一点点,时间也算是很久的了。毕竟我大学也就只有前三年是在学校的,后面就出来实习了。现在走呢也不是说因为公司有啥问题或者我被开除了,只是说我自己觉得是时候出去看看了,不想常年在一家公司里待下去
这次跳槽主要是这三个问题导致的:
1.…
0X00 What's this
我们知道 MySQL 中存在“事务”这么个事物(我是故意拗口的,哈哈哈哈哈哈哈);我们也知道事务“一荣俱荣,一损俱损”(要么事物内所有查询均生效,要么均不生效)。那么现在问题来了,银行数据库中有两个事务在同时进行,我们来看一下这两个事务
一条 SQL 就是一个查询,不一定是 SELECT xxx 才叫查询。
现在有这么一个情况:shawn 和 bluce 两人账上都有 100 块钱,此时事务 A 和 B 同时开始执行,那么事务 B 所查询到的两人的账户余额究竟是多少呢?这个问题并没有一个确切的结果,因为 B 在查询的时候,转账正在进行中。不过要回答这个问题也不是做不到,就需要引入标题中提到的“隔离等级”这个概念了。
我们在 MySQL 中使用这四种隔离等级:READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE。隔离等级的不同就意味着在同一个时间节点下查询到的内容可能不同,数据的可靠性也会变得不同。接下来我们来简单了解一下这四种隔离等级,并且通过一个测试数据库来验证一下。
0X01…
0X00 使用 with as 语法
我们写程序经常会操作文件,我们都知道写文件要 open/write/close ,尤其是 close ,没有的话文件就会出问题(有些内容在缓存里,没写入磁盘)。不过我们现在写文件应该没什么人这样写了,都是用with open('filename', 'w') as f的方式来操作文件了。如果说这样做的好处,那多数人都会说“不用手动关闭文件了”,错肯定没错的。
上下比起来,上面的方式不仅多了一点点代码,而且随着中间逻辑代码变多,很可能会导致最后忘记 close,从而引发 bug。
0X01 这就是上下文管理器
上面 with xxx as xxx 的调用方式就是在调用上下文管理器。简单来说上下文管理器就是:在执行你编写的代码(with xxx as xxx后面那坨)之前,操作一波 ;再在你编写的代码执行完后,操作一波 。我们简单理解一下就是在 with open('file_name', 'w') as f 内层缩进的代码执行完成后自动帮你执行了f.close()(当然没这么简单,有兴趣可以去看一下 open 的源码,但是大体逻辑是这样的)。…
0X00 objects 是个啥
想必所有用过 Django 的人都会用到 Django 自带的 ORM 进行数据库查询。那既然用过 Django 的 ORM 就来看一下这段代码好了, models.Stuent.objects.filter(name='Shawn') 这段代码是什么意思呢?很简单,就是查询到名字为"Shawn"的学生信息。具体来说, models 应该是一个放了多个 model 的文件,Student 是一个具体的模型,filter 是筛选,name='Shawn' 则是筛选条件。那么问题来了,中间那个 objects 是个啥呢?(你知道?知道还在这儿看啥,有这空看看其他文章,打打游戏看看电影不好吗🤣)
通过 type 可知,这个 objects 是一个 django.db.models.manager.Manager 的实例(或者是他子类的实例)。然后我们来看看这个Manager是个什么❓
A Manager is the interface through which database query operations are provided to…
0X00 按惯例得有一个标题
众所周知save是 Django 中最常用的保存数据的方法。但是一般来说大家经常会把“常用“理解成“万能“,然后能用的时候就全用这一种方式。不过编程 中是没有所谓的“一招鲜吃遍天“的,Django 之所以提供了那么多中保存数据的方法也侧面证实了这一点。
首先来看一下我遇到的这个问题:
这段代码乍一看没有什么问题,因为计算的值是通过calculate_score这个函数进行的,所以不能使用queryset.update(xxx)的方法。然后咱们看一下 Django 文档是如何描述 queryset 的。
QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated.
QuerySets are lazy…
0X00 Django 中的权限结构、定义
我们知道在创建了一个 Django 项目之后,默认就有两个公开可用的 model:User 和 Group,这两个 model 的一项功能就是用来做权限管理的。系统中会有很多项权限,单个 user 可以配置拥有哪些权限,也可以将权限配置给 group。然后校验单个权限的时候其实就是将 user 本身的权限,和 user 所在的所有组的权限做一个并集,看本次操作的权限是否在这个并集里。在,那就校验通过;不在,那就只有 HTTP 403 了。
HTTP 401 和 HTTP 403 的区别:401 的描述是 Forbidden,而 401 是 Unauthorized,前者是没有权限,而后者干脆没通过认证。举个例子,你想查看公司财务的详细报表,财务经理一看你就是个一线小程序员,就给你一个 401,告诉你这不是你可以看的东西。如果你想看别的公司财务的详细报表,别人公司财务经理一看你根本不是他们公司的人,就直接给你了个 401 了。(俗话说十个比喻九个不准,我这个比喻当然也并不非常准确,不过对于分不清 401 和 403…
0X00 网站怎么登陆
回忆一下你用过的网站们,一般都是怎么登陆的? “就输入用户名密码登陆呗,要么就扫码登录,要么手机验证码登录,还能有啥”。确实没啥,咱们平时用到的登录方式也就都是这样的,而且这些其实从原理上来说都是 证明你是你 的手段,用户名密码是通过“密码只有你自己知道”为前提的,扫码和验证码是以“手机一定在你自己手上,并且只有你自己能解锁”为前提的。所以其实用户名密码并不是登录的唯一方法,理论上能证明你是你的一切方法都可以用来做授权认证,所以我们可以看到除了密码,出现了扫码、短信邮箱验证码、指纹、人脸、声纹、虹膜巴拉巴拉的。
上面这些都是稳定靠谱的登录方式,我们来想另一个问题,你们有一个网站选用了用户名密码的方式登录,你和用户开开心心登录。后来你上线了另一个网站,你觉得用户该怎么登陆这个新网站呢?“新网站就再注册一次呀!”好的,用户又注册了一次。随着你们公司业务逐渐壮大,上线了 100 个网站,那用户要注册一百次吗?万一自己常用的用户名被占用了呢,岂不是 100 个网站可能会用 100 套不同的用户名密码?那用户可能就要骂娘了呦。…
0X00 运行一个 Django 程序
运行一个 Django 程序可太简单了,从创建项目到运行起来总共也不超过 5 行代码。项目运行起来了就可以打开我们的 vim 或者 IDE 之类的一顿 coding 了。作为最最最开始写 Django 的同学来说到这里也就了解的差不多了,因为大家都是自己写好代码本地测试一下就提 Pul Request 到上游仓库了,然后什么单元测试、数据库迁移、测试环境版本发布甚至可能包含 docker 镜像更新就全都交给 CI 来做了。自己就这么开开心心的写了一段时间的代码,一切都在朝着好的方向发展。突然有一天部门主管或者老大告诉你有一个新项目要你来开个头,先搭好脚手架然后发布上去,后面再来人一起做功能迭代。
然后你开开心心地django-admin startproject xxxx、开开心心地django-admin startapp xxxxx,一顿 coding 之后懵逼了,没有部署过测试环境,没有部署过生产环境,只知道 CI 给做了,却完全不知道做了什么。然后你跑去看 CI 脚本,去问其他同事同学,得到了一堆 Nginx 和 uWSGI…
0X00 前言
一见程序员,立刻想到 web 开发,立刻想到后台管理系统,立刻想到数据展示,立刻想到数据筛选筛选,立刻想到数据统计,立刻想到导出 Excel 表格。产品经理的想象惟在这一层能够如此跃进。 --鲁迅:我不是,我没有,别瞎说
虽然上面这种说法有点夸张了,不过确实很多很多很多人在工作中遇到过不止一次的需要在一个 web 系统里添加一个”数据导出”的功能,而且通常都是导出成 csv 这种文件。自然我也遇到了很多很多很多次,也写过那种最蠢的手拼逗号的 csv 导出,还看过别人效果更好代码量更少的版本。也就在此总结一下具体这个 csv 导出该怎么搞才好。
最蠢的方案可能就是我最早实习的时候写出来的那种手拼逗号的方案了,为了大家刚吃的早午晚饭着想,就不给大家看了,省得吐出来浪费粮食。真正用的比较多的是这么两种:一种是传统的拼接二维数组的方式来模拟表格,然后通过 Python 的 csv 库直接导出;另一种是使用 djcsv 来进行导出。下面来简单看一下嘞。
0X01 原始 csv 导出
其实简单的导出原始的方法就可以解决问题了,下面只列出重点代码。首先导入 csv…