- 为每个用户使用唯一的盐对用户密码进行哈希处理,这样当您的数据库可以被外人访问时,他们无法解密密码,并且盐可以缓解彩虹表攻击。
2 - 4. 使用一个表来表示访问级别(1:成员,2:主持人(批准),3:管理员),并使用另一个不同的表来存储多对多连接的用户权限,如下所示:
id (auto_increment)|usr_id|role_id|group_id
-------------------------------------------
1 |1 |3 |-1
2 |2 |2 |1
3 |2 |3 |2
4 |3 |1 |2
在您的情况下,用户 1 是整个站点的管理员,用户 2 是组 3 的管理员和组 2 的版主,用户 3 是组 2 的成员。
[编辑:]
关于限制不同角色的权力的更多想法:根据您的设置,您应该在每页的基础上使用一些角色强制执行,例如在 MVC 框架中,我将扩展基本控制器以要求具有的(角色)授权功能为每个方法调用,否则应该抛出异常。不需要用户登录的方法(页面)可以使用虚拟授权。
所以授权类看起来像
class Authorization
{
public $authorized = false;
public function dummy()
{
$this->authorized = true;
}
public function member($usr_id, $group_id = null)
{
$sql = "SELECT usr_id FROM usr_roles WHERE usr_id = " . $usr_id . ($group_id !== null) ? " AND group_id " . $group_id : "";
// count the results of $sql query
// or some more stuff
if ($results > 1)
{
$this->authorized = true;
}
else
{
$this->authorized = false;
}
}
// the other functions
}
您的新基控制器类将如下所示:
class BaseController extends Controller
{
protected $authorization;
public function __construct()
{
$this->authorization = new Authorization();
}
public function render()
{
if ($this->authorization->authorized === true)
{
parent::render
}
else
{
// redirect to not authorized page
}
}
}
最后,您的控制器将如下所示:
class IndexController extends BaseController
{
// some stuff, methods etc.
// methods needs logged in user and user must be a member.
public function index()
{
$this->authorization->member($session_user->getId());
}
}
[编辑2:]
如果您不熟悉 OOP,则可以执行以下操作:
这是角色表的示例布局:
role_id|role_name
-----------------
1 |member
2 |moderator
3 |admin
然后,您可以创建一个函数 authorize() 以包含在您的所有文件中:
// role_name = "member", "moderator", "admin"
function authorize($usr_id = null, $role_name = null, group_id = null)
{
// test for user in group and role, return boolean
}
在您的文件中包含此功能并执行以下操作
if (authorize($usr_id, "moderator", 2)
{
// show stuff, if user with $usr_id is moderator for group 2
}
else
{
// do something else
}
// stuff for all