我的团队目前正在研究PHP中一个中型应用程序的大规模重构。我们正在尽力重构我们的代码在一个模块(订单,用户,产品)的基础上。我目前想知道的问题是处理用户可以在我们的系统上做什么。
目前,这主要取决于用户对我们系统的访问级别。有时,我们可能不得不引用他们拥有的组,以查看是否允许更高级别的组做一些事情(下订单),并将该权限传递给用户。
到目前为止,我想出的是一个叫做“守护者”的课程。卫报接收用户,然后拥有"canPlaceOrder“或"canViewOrderReport”之类的函数。这种方法的一个好处是,我们能够看到系统上所有需要权限的操作。此外,这将使我们能够将权限逻辑从前端和域模型中分离出来。
但是,我可以看到这不是一个完全可伸缩的解决方案。按照OOP原则,类应该开放供扩展,关闭以进行修改,我可以看到,随着我们向系统添加更多的权限,我们的卫报类也必须添加更多的方法。
我确实喜欢使用一个类以人类可读的方式很好地定义我们所有的权限的好处,这样我们总是知道我们正在检查正确的标准。但是,我担心可伸缩性。是否有其他方法来解决这个问题?
我的问题是:什么是处理这件事的好方法?我的解决方案还好吗?
发布于 2015-03-05 13:41:41
守护者
public boolean checkPermission(String permissionTag, int userID);方法。
这样,当新的权限存在时,监护人就不必更改。
用法
if (guardian.checkPermission("PLACE_ORDER",loggedUser)) {
// place order
}发布于 2015-03-06 02:06:05
有几种好办法。
您可以通过始终使用工厂获取卫报并返回继承上一个版本的卫士的子类型来实现开放关闭。新功能可以转换为最近的子类型。
你也可以通过.添加方法!知道不去碰别人。虽然这更容易搞砸,但你必须知道你在做什么。不幸的是,一个不知道自己在做什么的开发人员会把前面提到的方法搞砸(更常被引用为实现开放-关闭的方式)。
您还可以列出“权限”基类型。Wireup/startup将使用对象填充列表。然后只需添加继承的权限即可。为了进行查询,最新的代码可以搜索列表的子类型,并调用它。
例如,在.net中,您甚至可以创建一个方法(这里的php很弱,但也不要尝试编译这个方法):bool GetPermission() {GetPermission(从_permissionList.OfType中的p返回).First();}
用法: can_do_this=GetPermission().NeedManagerApproval();
还有..。还有很多其他的方法。
是的,这是一个方面/横切的问题。但是..。
我认为一个不好的方法是将AOP框架添加到您的项目中。
发布于 2015-03-05 13:51:40
你的解决方案没问题。
安全性和可访问性在您的系统中是普遍存在的,因此在添加权限时必须添加方法是可行的。
在PHP程序中,使用字符串来标识权限是可以的,因为在运行时之前,您永远不会发现代码是错误的。字符串也可以组成:
if ( guardian.checkPermissions(["PLACE_ORDER", "MODIFY_ORDER"]) ) {
// place a modified order
}https://softwareengineering.stackexchange.com/questions/275347
复制相似问题