首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在网站中构造组?(行政、行政权力、用户身份)

如何在网站中构造组?(行政、行政权力、用户身份)
EN

Stack Overflow用户
提问于 2009-10-06 17:49:02
回答 7查看 3.2K关注 0票数 3

我要做一个小的用户系统,但我有问题。

  1. 如果我要创建一个登记表(mysql),那么只将密码和用户名不加加密地存储到数据库中有什么问题呢?
  2. 我正在考虑如何构建管理部分。我是否应该检查一下数据库中的一个列,看看用户是否是管理员?如果是的话,那么管理页面就会被揭露。
  3. 对于管理权限,假设我有3种权限:删除用户、批准用户和移动用户。在一些情况下,我可能只想给一些人批准、删除、或全部或任何组合的能力。我该怎么做呢?我正在考虑为每个电源设置一列,并让脚本检查每一列。假设我有20多个超能力会被增加。
  4. 如果我有一个网站,人们可以创建组并成为其组的管理员,而这些管理员可以将不同的管理权限组合给他们组中的人(例如,Zack创建了名为third的组,并授予一名成员批准新组成员的能力,并授予第二名成员删除成员和分配第三名成员删除和批准的能力。我将如何在MySQL中构建这个结构?我是否应该使用列来说明他们是哪个组的管理员,以及他们有什么能力?例如,列:删除、批准、GroupMemberOf、GroupAdminOf和使用检查。

我有一个想法,但我想学习更复杂的方法。

到目前为止的答案非常感谢,但是,我真的在寻找关于一个结构的想法(问题2-4),如果我能帮你解决这个问题,请告诉我。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-11-02 15:51:17

  1. 散列用户密码,为每个用户提供唯一的盐类,这样当您的数据库可以被局外人访问时,他们就无法解密密码,而salt则减轻了彩虹表攻击

2- 4.使用一个用于访问级别的表(1:成员,2:版主(批准),3: admin),并使用另一个不同的表用于用户权限,其中存储多到多个连接,如下所示:

代码语言:javascript
运行
复制
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框架中,我将扩展基本控制器以要求为每个方法调用一个(角色)授权函数,否则它会抛出一个异常。不需要用户登录的方法(页)可以使用虚拟授权。

所以授权类看起来像

代码语言:javascript
运行
复制
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
}

新的基本控制器类如下所示:

代码语言:javascript
运行
复制
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 
        }
    }
}

最后,您的控制器将看起来像:

代码语言:javascript
运行
复制
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,那么可以执行以下操作:

下面是一个角色表的示例布局:

代码语言:javascript
运行
复制
role_id|role_name
-----------------
1      |member
2      |moderator
3      |admin

然后,可以使一个函数授权()将其包含在所有文件中:

代码语言:javascript
运行
复制
// 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

}

在您的文件中包含此函数,并执行以下操作

代码语言:javascript
运行
复制
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 
票数 5
EN

Stack Overflow用户

发布于 2009-10-06 18:00:27

  1. 如果您不加密地存储密码,则当有人设法窃取您的数据库或对其进行读取访问时,您将泄露客户的所有密码。可悲的是,大多数人在网站之间重复使用用户名和密码,所以你不保护用户的密码对你的用户不利。(也许他们应该更好地知道,但大多数人不知道。)
票数 3
EN

Stack Overflow用户

发布于 2009-11-02 23:58:55

1)存储明文密码的意味着,如果有人能够访问您的数据库,他们仍然不知道密码。关于盐碱化和加密密码的炒作是相当愚蠢的,一个简单的方法对任何人都行。

代码语言:javascript
运行
复制
$password = "Mypassword";
$salt = "a unique and constant string";
$password = md5($password.$salt);

这样做是通过md5();加密密码,在用md5()对密码进行加密之后,无法获得密码。盐渍也确保没有办法只找到密码。

如果您想比较并查看密码是否有效,只需按如下方式对输入进行md5:

代码语言:javascript
运行
复制
$password = "check_this_password";
if(md5($password.$salt) === $originalPassword) 
{ 
    //same password
}

2)这个问题取决于您希望如何将组与管理端集成。如果根本没有其他权限设置,那么只需在数据库中存储一个带有帐户级别的字段是安全的。否则,使用我的下一个点来找出他们是否是管理员。

3)实现权限系统的最简单方法是这样的,还有其他方法,但最好不要使它复杂化。如果您想要每个组的权限,可以添加一个像prm_group_id这样的额外列,并在特定组的权限中查找每个用户。但无论如何,它的工作原理如下:

创建一个表来保存权限

代码语言:javascript
运行
复制
prm_user_id  | prm_permission
   0         | Admin
   0         | Delete
   1         | Add

每一行都有一个标志或权限。那么,通过一点SQL和PHP就可以很容易地找到它们是否具有所需的权限。

代码语言:javascript
运行
复制
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;
}

这使您可以很容易地添加和删除权限,并检查和查看它们是否具有权限。唯一的缺点是管理权限会变得非常棘手。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1527069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档