写代码注意了,打死都不要用 User 这个单词

阅读本文大概须要 4 分钟。

原文:http://t.cn/Eau2d0hnginx

译文:http://21cto.com/article/2093程序员


当你意识到你在项目开始时作的轻量、简单的设想居然彻底错了时,你已经用了六个月的时间投入到这个项目上。

如今你须要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,若是一开始就用正确的方式来作,就不会发生这样的事。
web

今天,我要告诉你的是一个常常犯的错误,一个会给你带来无穷无尽的问题的单词,那就是“users”。ubuntu

这个单词有两个最基本的错误:浏览器

一、对你的需求来讲 “User” 几乎历来都不是一个好的描述。安全

二、“User” 会致使一个基本的设计安全缺陷。服务器

“user” 的概念是模糊不清的,使用更精准的术语几乎老是能起到更好的效果。微信


你没有使用者


最开始,没有任何一个软件系统真的有使用者存在。乍一看“user”是一个好的描述,可是你稍微一想就会意识到你的业务逻辑实际上比这要复杂的多。学习

我会使用三个例子,从一个极端的状况出发。网站


机票预订系统没有“users”


我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:

  • 旅客可使用预约记录码经过网站查看预约信息。
  • 购买者能够经过信用卡号后四位数在网站上修改预订信息。
  • 旅行社能够查看和修改他们的预订。
  • 航空公司的值机人员能够根据角色和航空公司来查看和修改预订信息,这须要旅客提供身份信息。
再也不一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也但是看做代理)和“购买者”。
“user”这个概念根本没用,而且在许多请求中我根本不会使用这个单词,举个例子,咱们的请求必须包括旅客和代理人的证件,而不是使用者的证件。


Unix 没有 “users”


咱们看一个不太同样的例子。Unix (这些天被称为POSIX)有用户,他们能够登陆并执行代码。这样看起来很不错吧?咱们深刻看一下。
若是咱们把全部都看成“users”的话,咱们将会有:使用终端或者图形界面登陆的人
  • 像邮件或者web服务器这种系统服务也会以“users”的身份运行,例如nginx能够以httpd用户运行。
  • 在服务器上常常会有多人共享一个管理员帐号用来SSH登陆(例如,亚马逊的Ubuntu虚拟机默认SSH帐号就是‘ubuntu’)
  • root 身份,和上面其余身份都不一样。
上面四个是几乎不一样的概念,可是在POSIX上他们都是 “users”. 一下子咱们就会看到,把这些概念都称为‘user’会致使不少安全问题。
在操做上,由于POSIX的用户模型边界存在,咱们甚至不能找到一种方式说“只能让 Alice 和 Bob 经过这个帐号登陆”。


SaaS 服务提供商没有 “users”


Jeremy Green 最近就用户模型在SaaS中的应用在推特上发文,它第一次提醒了我写下这篇文章,他的基本观点是SaaS 服务几乎老是:
一、某个组织中的一我的支付服务费用。
二、一个或多我的共同使用这个服务。
若是你一开始就把这些人做为一个用户,你将会陷入一个痛苦的世界。你没法创建团队模型,你没法组建同时为多人支付的模型,而后你就会开始改造你的系统。如今你在SaaS案例中学到了一课,咱们来看一看你的生活。
可是这只是众多例子中的一个:“users”的概念太模糊了。若是你开始怀疑“user”这个词,最终你可能发现最终你其实只须要两个概念:团队(用来组织关系和支付)和成员(实际使用服务的人)。


“Users” 是一个安全问题


“user” 这个单词不只是业务逻辑的问题,它也致使了一系列安全问题。“user” 这个单词如此的模糊以致于从根本上将两个概念合并了:
  • 一我的。
  • 他们在软件中的表明性。
为了说明这个问题,假设你正在访问一个居心不良的网站,在它服务器上的图片致使了你的浏览器内存溢出。远程网站控制着你的浏览器,而且开始将你的文件上传到他的服务上。为何它能这样作?
由于浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上大家是不一样的。
你做为’user’,不想上传文件。可是系统的帐号也是‘user’,可以上传文件,若是浏览器运行在你的帐号之下,他全部的行为会被看成是你的意图,也就是说是你让它这么作的,实际上不是。
这就是被称为Confused Deputy的问题。若是你使用“用户”这个词来描述两个根本不一样的东西,那么这个问题就更有可能成为你设计的一部分。


前期设计的价值


花更少的功夫处理相同的问题是成为高产程序员的关键。使用模糊不清的概念好比“用户”来组织你的软件,将会话费大量时间和精力来解决将来发生的问题。一上来就开始编码看起来是高产的,事实刚好相反。
下次你开始一个新的软件项目时,花几个小时预先肯定你的术语和概念:你仍然不会彻底正确,但你会作得更好。将来的你将感谢你所作的全部预防浪费的工做。


·END·

程序员的成长之路

路虽远,行则必至

本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。

回复 [ 520 ] 领取程序员最佳学习方式

回复 [ 256 ] 查看 Java 程序员成长规划

相关文章
相关标签/搜索