我要做一个小的用户系统,但我有问题。
我有一个想法,但我想学习更复杂的方法。
到目前为止的答案非常感谢,但是,我真的在寻找关于一个结构的想法(问题2-4),如果我能帮你解决这个问题,请告诉我。
发布于 2009-11-02 15:51:17
2- 4.使用一个用于访问级别的表(1:成员,2:版主(批准),3: admin),并使用另一个不同的表用于用户权限,其中存储多到多个连接,如下所示:
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());
}
}
EDIT2:
如果您不熟悉OOP,那么可以执行以下操作:
下面是一个角色表的示例布局:
role_id|role_name
-----------------
1 |member
2 |moderator
3 |admin
然后,可以使一个函数授权()将其包含在所有文件中:
// 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
发布于 2009-10-06 18:00:27
发布于 2009-11-02 23:58:55
1)存储明文密码的意味着,如果有人能够访问您的数据库,他们仍然不知道密码。关于盐碱化和加密密码的炒作是相当愚蠢的,一个简单的方法对任何人都行。
$password = "Mypassword";
$salt = "a unique and constant string";
$password = md5($password.$salt);
这样做是通过md5();
加密密码,在用md5()对密码进行加密之后,无法获得密码。盐渍也确保没有办法只找到密码。
如果您想比较并查看密码是否有效,只需按如下方式对输入进行md5:
$password = "check_this_password";
if(md5($password.$salt) === $originalPassword)
{
//same password
}
2)这个问题取决于您希望如何将组与管理端集成。如果根本没有其他权限设置,那么只需在数据库中存储一个带有帐户级别的字段是安全的。否则,使用我的下一个点来找出他们是否是管理员。
3)实现权限系统的最简单方法是这样的,还有其他方法,但最好不要使它复杂化。如果您想要每个组的权限,可以添加一个像prm_group_id
这样的额外列,并在特定组的权限中查找每个用户。但无论如何,它的工作原理如下:
创建一个表来保存权限
prm_user_id | prm_permission
0 | Admin
0 | Delete
1 | Add
每一行都有一个标志或权限。那么,通过一点SQL和PHP就可以很容易地找到它们是否具有所需的权限。
function hasPermission($permission, $userID)
{
$permissions = array();
$sql = "SELECT prm_permission FROM user_permissions WHERE prm_user_id = $userID";
$query = mysql_query($sql);
while($data = mysql_fetch_array($query))
{
$permissions[] = $data['prm_permission'];
}
//Check if they have a permission with this:
if(in_array($permission, $permissions))
{
return true;
}
return false;
}
这使您可以很容易地添加和删除权限,并检查和查看它们是否具有权限。唯一的缺点是管理权限会变得非常棘手。
https://stackoverflow.com/questions/1527069
复制相似问题