加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

重构困境:PHP中的用户帐户功能

发布时间:2020-12-13 17:10:55 所属栏目:PHP教程 来源:网络整理
导读:我正在用 PHP编写一个用户帐户系统,重点是安全性,但我仍然坚持将它重构为更清洁,更实用的东西. 问题是尝试将用户帐户功能组合在一起,但是在单独的类中.我现在这样做的方式是,有一些带有公共静态方法的类都将$username作为第一个参数,并且它们使用其他静态方
我正在用 PHP编写一个用户帐户系统,重点是安全性,但我仍然坚持将它重构为更清洁,更实用的东西.

问题是尝试将用户帐户功能组合在一起,但是在单独的类中.我现在这样做的方式是,有一些带有公共静态方法的类都将$username作为第一个参数,并且它们使用其他静态方法,同样传递与第一个参数相同的$username.显然,OOP是一种更好的方法,特别是因为每个方法都必须使用用户名来进行数据库查询,并且必须处理提供的用户名根本不存在的情况.

将所有内容放在“用户”类中的问题在于它会很大,并且在同一个文件中会有很多完全不相关的代码.例如,更改密码代码不需要调用与验证用户的电子邮件或更改用户(不相关)设置相关的方法.

我可以有两个类:User和AuthenticatedUser,AuthenticatedUser继承User.用户可以在没有用户登录的情况下实现所有可能的功能,AuthenticatedUser将是需要登录的所有功能 – 例如访问用户的加密数据.维护代码可以使用User的对象,GUI代码将在用户登录后获得AuthenticatedUser对象.但我不想将所有功能都塞进用户.

以下是与用户帐户相关的一些操作的列表,只是为了说明为什么它们不适合一个类:

>登录
>锁定用户如果> = X在过去的Y分钟内尝试(包括用于确定用户是否被锁定的方法,向尝试计数添加勾号等).
>使用电子邮件循环绕过锁定
>更改密码
>管理员更改密码(强制)
>密码重置(电子邮件循环)(包括启动重置,验证电子邮件令牌等的方法)
>设置/获取以纯文本格式存储的用户数据
>设置/获取加密的用户数据
>设置/获取帐户设置(允许密码重置?,在密码失败时锁定帐户?,是否允许通过电子邮件循环绕过锁定等等)理想情况下,这些设置应设置/接近行为取决于它们的代码.
>在正确的情况下获取用户的用户名(正如他们在创建帐户时指定的那样)
>电子邮件验证
>许多功能仅由特定代码使用.例如.获取用户“salt”用于密钥派生.
>更多……

我以为我可以做一些像继承User的PasswordChanger类,并实现密码更改功能.所以它看起来像:

$proper = $user->getProperName();
...
$passChanger = $user->getPasswordChanger();
$result = $passChanger->changePassword($oldPass,$newPass);
...
$userLockout = $user->getUserLockout();
$result = $userLockout->isUserLockedOut();
...
$userEV = $user->getEmailValidation();
$result = $userEV->tryValidateEmail($token);
...

这是迄今为止我提出的最佳解决方案.它允许我将相关的功能分解到它自己的文件中,并且不必传递用户名.但它似乎很奇怪 – 我以前从未见过这样的代码.它迫使超类知道它的所有子类,这是糟糕的设计.有任何想法吗?

编辑:另一种避免继承的方法是拥有一个拥有User的PasswordChanger.喜欢:

$passChanger = new PasswordChanger($user);
$passChanger->changePassword($old,$new); // uses $user->getUsername() 
...
$emailValidator = new EmailValdiator($user);
$emailValidator->tryValidate($token);

“PasswordChanger有一个用户”与“PasswordChanger是用户”.前者实际上是有道理的,所以我喜欢这种方式更好一点.

解决方法

好吧,你已经有了一个良好的开端,而且你正在提出正确的问题.但是没有一个答案.设计是一门艺术,而不是一门科学.听起来好像你正试图重新设计而不是重构.你可能会发现如果你开始重构你的代码只是对你的设计可能最终结束的一个简单的想法(这是一个非常好的重构资源是 book by Michael Feathers)你会发现它更容易.当你重构越来越多时,你应该发现一个设计出现了黑暗!通常那个设计并不是你开始时想到的最终结果.

哦,btw继承是OO最常用的方面之一.如果您正在考虑继承,请停下来再思考.如果你仍然认为你需要继承,那就停下来思考一下.如果你仍然认为你需要继承,你有可能……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读