gpt4 book ai didi

php - 登录时验证用户并授予他们有限的数据库权限

转载 作者:可可西里 更新时间:2023-11-01 07:45:15 30 4
gpt4 key购买 nike

我是PHP和MYSQL的新手,试图创建一个网站,用户可以用来将数据输入数据库。我要尝试的一个示例是为各家银行及其提供的各种服务提供数据库。例如,花旗银行的用户在我的网站上创建了一个帐户,他将输入自己的LoginID,Password,Email和姓名的银行(在本例中为花旗银行)。

成功创建帐户并登录后,他将成为花旗银行的“管理员”帐户,并有权创建,删除,插入和查看花旗银行中的所有数据。 他还可以进一步创建和删除出口,以及为该出口创建/删除子用户帐户。该子用户帐户将拥有管理帐户的所有权利减去有权创建其他子用户,但仅限于管理员帐户和子帐户都可以通过该网站登录。

我列出了我认为帐户需要的权利:

Rights to database
SELECT,INSERT,UPDATE,DELETE,(JOIN?)

我目前正在考虑为管理员帐户实现下表:
Admin
+----------+-----------+------------+------------+
| BankID | BankName | UserName | Password |
+----------+-----------+------------+------------+
| 1 | Citibank | CitiAdmin | PassCiti |
| 2 | StanChart | StanAdmin | PassStan |
| 3 | HSBC | HSBCAdmin | PassHSBC |
+----------+-----------+------------+------------+

当BankID的类型为SERIAL时,而BankName,UserName和Password将由用户在创建帐户时输入。我之所以不将上表分为2个表,其中一个表包含BankID和BankName,其他包含用户名和密码的将是易于使用,因为我认为将它拆分是不必要的,并且对其进行了过度规范化。

下表适用于子用户帐户:
SubUsers
+------+------------+--------------+-------------+
| ID | OutletID | Name | Password |
+------+------------+--------------+-------------+
| 1 | 1 | CitiSub1 | PassSub1 |
| 2 | 1 | CitiSub2 | PassSub2 |
| 3 | 2 | StanSub1 | PassSub1 |
| 4 | 2 | StanSub2 | PassSub2 |
| 5 | 3 | HSBCSub1 | PassSub1 |
| 6 | 4 | HSBCSub2 | PassSub2 |
+------+------------+--------------+-------------+

这样,在用户登录时,我将从$ _POST [User]和$ POST [Pass]获取用户条目,并与从查询中提取的数据进行匹配
$query="SELECT Username AND Password FROM Admin AND SubUsers";

如果存在匹配项,则该用户将登录。通过这样做,我可以实现第一级验证,其中只有注册用户才能访问数据库。

但是我将如何限制对Admin帐户和SubUser帐户的访问。Admin帐户只能访问与他的银行有关的数据,而SubUser帐户只能访问与他的出口有关的数据。

我曾考虑过使用PHP session 在登录时通过更改登录查询来记录有关用户的数据。

$ query =“从管理员和子用户中选择用户名和密码”;

到一个查询,该查询首先从Admin中选择用户名和密码,然后运行$ _POST [User]和$ _POST [Pass],如果没有匹配项,它将从SubUser中提取用户名和密码并重复该过程,并且将结果记录到 session 中,具体取决于匹配是在Admin表还是SubUser表中发生的。

但是,这样做只会更改用户登录后可用的网页,而不会更改他们对数据库本身的实际访问权限。我能想到的使用此方法的最接近解决方案是为用户创建一套全新的网页,具体取决于无论用户是Admin还是SubUser,我都不愿意这样做,因为我还是编程新手,而增加网页数量只会增加不可避免地显示的错误数量。

还有其他任何方法来限制用户对数据库的访问,或者是否有其他解决方案来优化我正在尝试做的事情?

我看过 How to configure phpMyAdmin for multiple users - each with access to their database only,但对我来说有点技术性,似乎正在处理用户对数据库而不是表的访问。

任何建议/帮助/指导将不胜感激。

最佳答案

这是一个有趣而彻底的问题。它不是那种需要一本书才能彻底回答的类型。我佩服你的野心。

首先正确设计。

  • 问问自己用户可能需要执行哪些操作并给他们命名。将特权名称存储在表中后,可以根据需要将它们分配给角色或用户。您可以通过在执行每个操作之前检查是否应用了适当的特权,或者通过将每个操作编写为包含特权身份验证的功能来对在PHP级别执行每件事的能力进行身份验证。
  • 在每个表中将银行ID和分支ID作为外键。这样,您只需将bankid和branchid作为WHERE子句的“AND”添加项包括在内。这样一来,您只需要一个数据库,但是您可以控制谁使用智能编写的SQL来查看内容。
  • 如果您需要用户能够对其数据运行SQL,请确保所有查询都通过添加必需的AND(bankid ='%s'AND branchid ='%s')子句的函数运行。这有效地分离了数据。如果需要的话,您可以添加对返回数据的检查,还可以考虑使用加密(每个存储库使用不同的密钥),尽管这有点远。

  • 这几乎就是应用程序层控制的含义。 PHP应用程序根据存储的特​​权选择您有权访问的数据。给他们有意义的名字和冗长的描述,我无法强调计划您的特权的重要性。当您开始时,似乎有很多工作要做,但是却有所作为。当然,不必为每个用户创建一个新的数据库。不必担心填写您的SERIAL ID-BIGINT可以在200,000多年的时间内每秒处理100万笔交易。

    设计完成后,身份验证将成为下一个障碍。我认为您应该在写任何花哨的内容之前先执行此操作,因为确实很难做到正确。

    我要做的是:

    收集银行,分行和用户名(允许它们在您的HTML中自动完成),然后输入密码。
    将密码存储为SHA1或MD5哈希。
    通过身份验证后,您可以将用户编号,银行和分支机构编号弹出​​到$ _SESSION中,然后可以在以后轻松地将它们检索以用于SQL。
    为了提高安全性,尽管增加了复杂性,但是您也可以根据需要从数据库中选择这些数字。有些建议将它们存储在单独的 session 表中。

    关于如何设计此类项目还有很多要说的内容,而且很多内容都可以在此站点的其他地方找到,所以我不再赘述。请随时询问是否不清楚。

    我希望这有帮助。

    编辑:

    处理特权。

    没有简单的方法来处理特权。我对所有页面都使用一个头文件,该文件会自动提取特权信息:

    一种。标识用户,通常从$ _SESSION中选择用户编号。
    b。从数据库表users_priveleges中识别用户的特权。
    C。创建一个包含特权名称的数组。
    d。对于每个通过数组进行比较,以便在需要特权请求操作时进行比较。

    此方法需要很多表,也许可以满足您的需要,但是如果您具有以下表(仅在此处提供骨架详细信息),则该方法几乎可以无限扩展:
    roles (role_id,rolename,role_detailed_description)
    priveleges (privelege_id,privelegename,privelege_detailed_description)
    users (user_id,user_details)
    users_roles (user_id,role_id) (optional but a good idea)
    users_priveleges (user_id,privelege_id) - priveleges granted to each user
    roles_priveleges (role_id,privelege_id) - the priveleges each role has.

    您要做的是在role_priveleges表中输入一行,将角色链接到特权。对角色所需的所有特权重复上述步骤。可能很多。没问题

    添加用户后,您将授予他们一个角色。然后,我读取Roles_priveleges表,并向 super 用户显示可能的角色列表作为复选框,如果通常将授予特权,则将其打勾,否则将其选中。 super 用户根据需要从列表中取消选择或选择,然后保存列表。
    保存列表时,我将users_priveleges表中该用户的所有条目标记为非 Activity 状态,并为每个特权插入新行。这使您可以跟踪更改,并且重要的是,可以查看特权的审核日期,即使它们没有更改也是如此。它最终不会使用太多数据,因为users_priveleges中的每一行都包含三个Bigint,一个 bool(boolean) 值和两个日期。

    如果您永远不想授予一个用户通常不会出现的特权,那么您可以简单地使用role_priveleges和users_roles。这最小程度地减少了数据消耗,但灵活性却大大降低了。

    我将承认我所描述的方法有些不雅,但是它提供了非常好的基于角色和基于用户的特权管理,同时将数据库保持在第4范式或更高级别。恕我直言,值得付出更多的努力,因为您的应用程序有一天会变得更大,并且现在添加这些东西要容易得多,而不是以后添加。
    同样,从初学者的角度来看,在进行一些困难之前,创建虚拟数据并确保SQL连接正常工作非常容易。

    关于php - 登录时验证用户并授予他们有限的数据库权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16757076/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com