PHP中身份验证系统的设计模式
我正在学习PHP,我很好奇是否有优雅的解决方案来设计网站的身份验证接口 基本上,我将有三种类型的用户:普通用户、管理员和“超级用户”。 每种类型的用户都有自己的操作 以下是我当前代码的简要概述:PHP中身份验证系统的设计模式,php,authentication,Php,Authentication,我正在学习PHP,我很好奇是否有优雅的解决方案来设计网站的身份验证接口 基本上,我将有三种类型的用户:普通用户、管理员和“超级用户”。 每种类型的用户都有自己的操作 以下是我当前代码的简要概述: # Regular User = Non-Authenticated interface IRegularUser { # Will return an object of a class that implements this interface public sta
# Regular User = Non-Authenticated
interface IRegularUser {
# Will return an object of a class that implements this interface
public static function loginUser ($name, $pass);
}
# Authenticated User
class AuthUser extends RegularUser {
public function logoutUser();
}
interface IAdmin {..}
interface IPowerUser {...}
class User implements IRegularUser {}
class Admin extends AuthUser implements IAdmin {}
class PowerUser extends AuthUser implements IPowerUser {}
在检查正确登录的脚本中,我将编写类似的内容:
$user = new User();
$user = $user->loginUser($_POST['username'], $_POST['password']);
if (get_class($user) == get_class(new Admin()))
# Redirect to admin_home.html
else if (get_class($user) == get_class(new PowerUser()))
# Redirect to power_user_home.html
我正在尝试使用PHP的OOP特性,以便在我的应用程序中的实体之间建立一些约束(例如:只有通过获取用户对象,才能登录并获取Admin或PowerUser类型的对象)
我觉得我的认证系统有点笨重,我想知道webapp认证系统是否有一种通用的设计模式。事实上,这并不像乍看起来那么简单。与用户打交道时,有三个不同的方面,它们都有各自的角色。您正在寻找的“系统”将由以下组件组成: 查询适配器 它负责查找与某些适配器匹配的记录。这可以查询几乎任何类型,无论是
MySQL
表、XML
文件还是Mongo
DB集合。所有查询适配器都将实现此接口:
interface QueryAdapter
{
public function recordValid($username, $password);
}
访问控制列表(ACL/RBAC)
它必须是独立的层,处理角色及其权限。典型的
$roleManager = new RoleManager();
$roleManager->register(array(
'admin' => 'write, edit, read, delete',
'user' => 'view',
'moderator' => 'write, edit, read'
));
$currentUser = get_that_from_session();
if ($roleManager->isAllowed($currentUser, 'write')) {
// Allow writing
} else {
echo 'You are not allowed to write';
}
存储适配器
负责将密码和令牌存储在$\u会话
或$\u COOKIE
中。若用户单击“记住我”,那个么您将把该信息存储在$\u COOKIE
中,否则将存储在$\u会话中
典型工作流
要将它们“连接”在一起,您可以这样写:(请记住,这是极其简化的版本)
“我想知道webapp身份验证系统是否有一个通用的设计模式。”没有。你似乎有一个好的开始,为什么不带着它跑呢?
<?php
$queryAdapter = new Query_Adapter_MySQL($pdo); // or $mongo, whatever
if ($queryAdapter->rowExists($_POST['username'], $_POST['password'])) {
$role = $queryAdapter->getRole(); // Let's assume that its "user"
$roleManager = new RoleManager();
$roleManager->register(array(
$role => 'read'
));
if (isset($_POST['rememberMe'])){
$storageAdapter = new StorageAdapter_Cookie();
} else {
$storageAdapter = new StorageAdapten_Session();
}
$storageAdapter->write(array(
'role' => $role,
'passwordHash' => $passwordHash,
'token' => $token
));
}
<?php
if ($storageAdapter->isLoggedIn()){
if ($roleManager->hasRight($storageAdapter->get('role'), 'read')){
// Allowed to read content
}
}