php中面向对象登录系统的类设计


Class design of object oriented login system in php

我已经开始提高我的OOP技能,在建立网站时解决一些比较容易的问题。所以它从一个登录系统开始,我遵循了 youtube 上的一个教程,它帮助我制作了一个登录类,但随着它的发展,它引起了许多疑问(顺便说一句。代码是 100 行,所以我会传递粘贴它)。

所以在这个 Login 类中,有验证方法等,但涉及到会话验证的一点,在构造中的参数之前给定,它不能被使用(至少在类范围内):

    $this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username'];
    $this->_password = ($this->_login)? $this->filter($_POST['password']) : '';
    $this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password'];

因此,在这种情况下,当没有设置会话变量时,我无法使用 verifySession() 方法(例如,区分登录用户应该在主页上看到的内容)。

所以我的问题是 - 设计是否正确,以及我应该如何构建登录系统的其余部分:loggedIn 验证在每个页面上并注销 - 它们中的每一个都应该在单独的类中(以及在特定类中重复的方法呢,我应该总是继承它们)。我意识到OOP有不同的方法,但是有什么特别的,我作为初学者应该遵循(这将有助于我最好地理解oop)。

我不确定你真的想要一个"登录"类。你可能会做这样的事情

class User
{
   private $username;
   private $password;
   public function __construct($username)
   {
     //load this user object here
   }
   private function hashPassword($password)
   {
      ///Dont do this has the hash, but im just keeping it simple
      return md5($password . 'a}{!@#' . $this->username);
   }
   public function authenticate ($password)
   {
      return $this->hashPassword($password) == $this->password;
   }
}

登录.php

$user = new User($_POST['username']);
if($user->authenticate($_POST['password']))
{
 //do session initilization here (can be a class, or whatever)
 Session::createUserSession($user)
}
else
 echo 'bad login';

注销.php

Session::destroyUserSession();

这种设计可能不是最好的方法,但可能会给你一个想法。

"

我在YouTube上关注了一个教程"是第一个问题。 仅粘贴的三行代码就表明您观看的视频是由业余PHP开发人员创建的。

"所以我的问题是 - 这个设计是否正确,我应该如何建造 登录系统的其余部分"

由于只发布了三行,我不知道设计是否正确。 我敢打赌不是。

何时使用对象的良好经验法则是,当代码明显足够先进,需要两个以上的函数,将在应用程序的多个位置使用,并且如果代码未封装在对象或命名空间中,则命名冲突的可能性很大。 这不符合该标准 - 登录和注册屏幕每个页面(最多)一页,因此该代码将使用一次。 没有理由封装这种逻辑。 Niko 提到了 Session 和 User 类,它们是常见的模式,可以封装。

至于构建登录系统,它们很快就会变得复杂,如今几乎是一种专业化。 我建议阅读以下SO wiki文章:

基于表单的网站身份验证的权威指南

如果你想要一个遵循上述维基文章的预打包系统,你可以看看:

http://barebonescms.com/documentation/sso/

SSO 客户端不向应用程序提供类 - 只是一组函数,如 SSO_LoggedIn()、SSO_Login()、SSO_Logout() 等。 仅仅为了做 OOP 而做 OOP 就足够了,这是编写软件的错误方式。 有时功能更好。 有时内联代码更好。 这真的取决于并且需要多年的经验才能深入了解什么是最好的方法。

$_SESSION['password']

永远没有必要在会话中存储密码(纯文本?您应该检查是否允许用户登录,如果他登录并提供了正确的密码,则您在会话中存储的不超过"已登录"。为方便起见,您也可以存储用户ID的用户名。

但是,将密码与数据库中的密码进行比较后,不需要密码。