用户级别和OOP体系结构


User Levels and OOP architecture

我正在为后端开发一个登录系统。

将有许多用户级别/权限来执行某些任务。

一个成员可以有一个或多个级别。

实现这一点的最佳架构是什么?

我带来了这些解决方案:

表格:

Group
 - group_id (P)
 - group_name
Group_User
- group_id (F)
- user_id

如何与OOP方法相联系?

OOP设计我已经提出:

class User {
private $privateSalt = "Don't Tell Anyone! Q£$£$^$";
public function newAccount($email, $password, $firstName, $lastName) { }
public function login($email = 0, $password = 0) { }
private function _setSession($data) {
    $_SESSION['logged_in'] = true;
    $_SESSION['member_id'] = $data['member_id'];
    $_SESSION['email'] = $data['email'];
    $_SESSION['first_name'] = $data['first_name'];
}
public function logout() { }
public function isLoggedIn() { }
}

没有必要在OOP属性中声明用户详细信息,因为我已经存储在会话中了?此外,如果用户刷新页面,建议再次对照数据库检查用户$_SESSION['member_id']?

登录系统实际上很容易做到,但很难做好。实现密码恢复机制,用户和管理员的用户帐户管理,可以添加和编辑的多个角色,当然所有这些都需要以安全的方式完成。再加上OAuth和OpenID,登录系统是许多现代应用程序中最复杂的部分之一。

我会考虑看看其他人是如何解决这个问题的,有一些库和组件,如Zend_Acl,可以帮助简化任务,并使您避免遇到一些基本问题。话虽如此,一定要探索你的想法,我的意思是,你正在做的事情很棒,我这么说并不是为了劝阻你。很多年前,我开始走和你完全一样的路。

话虽如此,我对你的新设计有几个问题要问。newAccount函数,这些是该函数唯一需要的参数吗?您可以考虑将对象传递给需要许多参数的函数,这样您就可以从类型提示中受益。函数login(),为什么参数设置为默认值0?这些真的是该函数的默认值吗?乍一看,$email=null和$password=null可能更好,但一个人可以在没有电子邮件/密码的情况下登录吗?如果您的应用程序逻辑依赖于设置这些值,那么可以使用函数签名来强制执行该逻辑。我认为这很好,尽管要保持主动并保持好奇心。

快乐的编码,朋友

回答您的第二个问题:我不知道您为什么要检查$_SESSION['member_id']

会话存储在服务器上,因此任何访问都要经过您编写的代码。因此,假设您的代码是安全的,那么会话中的数据应该是安全的。包括您存储在其中的任何权限。

我猜您想要的与其说是登录脚本,不如说是管理用户权限的体系结构。

登录脚本(以及权限的引导)应该相当容易。Stef的链接应该对此有所帮助。

对于具有组的权限体系结构,具有多对多关系的简单用户和用户组(您的Group_user)是一个非常通用的解决方案。我不知道它是否适合你的情况,但如果你的情况很普遍,它很可能适合。

我认为这是我在不了解你的具体情况的情况下可以放心地说的。如果有什么不同的话,就保持简单,不要重新发明轮子。