[英]Validating users upon login and giving them limited rights to database
我是PHP和MYSQL的新手,试图创建一个用户可以用来将数据输入数据库的网站。 我正在尝试做的一个例子是各种银行的数据库及其提供的各种服务。例如,Citibank的用户在我的网站上创建一个帐户,他将输入他的LoginID,密码,电子邮件和名称他的银行(在这种情况下将是花旗银行)。
成功创建帐户并登录后,他将成为花旗银行的“管理员”帐户,拥有创建,删除,插入和查看花旗银行所有数据的权利。 他还可以进一步创建和删除Outlets,并为该插座创建/删除SubUser帐户.Sub用户帐户将拥有Admin帐户所具有的所有权利减去创建更多SubUsers的权利,但仅限于Outlet管理员和子帐户都将通过网站登录。
我已经列出了我认为帐户需要的权利:
Rights to database
SELECT,INSERT,UPDATE,DELETE,(JOIN?)
我目前正在考虑为Admin帐户实现以下表格:
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]获取userentry并匹配从查询中提取的数据
$query="SELECT Username AND Password FROM Admin AND SubUsers";
如果匹配,则用户将登录。通过这样做,我能够实现第一级验证,其中只有注册用户才能访问数据库。
但是,我如何限制管理员帐户和SubUser帐户的访问权限。管理员帐户只能访问与其银行相关的数据,而SubUser帐户只能访问与其Outlet相关的数据。
我考虑过使用PHP会话来记录用户登录时的数据,方法是更改登录查询
$ query =“SELECT用户名和密码来自Admin和SubUsers”;
查询首先从管理员中选择用户名和密码,并通过它运行$ _POST [用户]和$ _POST [传递],如果没有匹配,它将从SubUser中绘制用户名和密码并重复该过程,并且将结果记录到会话中,具体取决于Admin表或SubUser表中是否发生匹配。
但是,这样做只会在登录时改变用户可用的网页,而不会改变他们对数据库本身的实际访问权限。我能想到使用这种方法的最接近的解决方案是为用户创建一组全新的网页,具体取决于无论用户是Admin还是SubUser,我都不愿意这样做,因为我还不熟悉编程,增加网页数量只会增加无法显示的错误数量。
是否有任何其他方法来限制用户访问数据库,或其他解决方案来优化我正在尝试做的事情?
我已经看过如何为多个用户配置phpMyAdmin - 每个用户只能访问他们的数据库,但它对我来说有点太技术性,似乎在处理用户访问数据库而不是表。
任何建议/帮助/指导将非常感谢。
多么有趣和彻底的问题。 这是一种需要一本书才能彻底回答的类型。 我很佩服你的雄心壮志。
首先要正确设计它。
问问自己用户可能需要做什么动作并给他们起个名字。 将privelege名称存储在表中后,可以根据需要将它们分配给角色或用户。 您可以通过在每个操作之前检查是否应用了适当的privelege,或者通过将每个操作写为包含priveleges身份验证的函数来验证在PHP级别执行每个操作的能力。
将bank id和branch id作为Foreign Keys放在每个表中。 这样,您只需将bankid和branchid包含为WHERE子句的“AND”添加项。 这只需要一个数据库,但你可以控制谁可以看到使用智能编写的SQL。
如果您需要用户能够在其数据上运行SQL,请确保所有查询都通过添加必需AND(bankid ='%s'和branchid ='%s')子句的函数运行。 这有效地分离了数据。 如果需要,您可以添加对返回数据的检查,并考虑使用加密(每个银行的不同密钥),尽管这有点远。
这几乎就是应用程序层控制的含义。 PHP应用程序根据存储的priveleges选择您有权访问的数据。 我不能重新强调规划你的权益是多么重要,因为他们有意义的名字和冗长的描述。 当你开始时似乎做了很多工作,但它有所作为。 它肯定胜过必须为每个用户创建一个新的数据库。 不要担心填写SERIAL ID - BIGINT可以处理超过20万年的每秒百万次交易。
设计完成后,身份验证成为下一个障碍。 我认为你应该在你写任何花哨的东西之前这样做,因为它真的很难做对。
我会做的是:
收集银行,分行和用户名(允许这些在您的HTML中自动完成),然后密码。 将密码存储为SHA1或MD5哈希。 一旦通过身份验证,您就可以将用户编号,银行和分支编号弹出到$ _SESSION中,然后可以在以后轻松检索SQL。 为了增加安全性,虽然增加了复杂性,但您也可以根据需要从数据库中选择这些数字。 有些人建议将它们存储在单独的会话表中。
关于如何设计这类项目还有很多话要说,其中大部分内容可以在本网站的其他地方找到,所以我不会赘述。 请随时询问是否有任何不清楚的地方。
我希望这有帮助。
编辑:
处理权利。
没有简单的方法来处理priveleges。 我为所有页面使用单个头文件,自动提取privelege信息:
一种。 识别用户,通常从$ _SESSION中选择用户编号。 湾 从数据库表users_priveleges中识别用户的权限。 C。 创建一个包含privelege名称的数组。 d。 每当需要privelege所需的操作时,通过数组进行比较。
这个方法需要很多表,并且可能有点高级以满足您的需求,但如果您有以下表格(此处仅提供骨架详细信息),它几乎可以无限扩展:
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.
你要做的是在roles_priveleges表中输入一行,将一个角色链接到一个privelege。 重复该角色所需的所有权益。 可能很多。 不是问题。
添加用户后,您可以为其授予角色。 然后,我阅读roles_priveleges表,并向超级用户显示可能的角色列表作为复选框,如果通常会授予privelege,则勾选,否则返回。 超级用户根据需要从列表中取消选择或选择,然后保存列表。
在保存列表时,我将users_priveleges表中该用户的所有条目标记为非活动状态,并为每个privelege插入一个新行。 这使您可以跟踪更改,更重要的是,即使它们未被更改,也可以跟踪审核的日期。 它最终不会使用太多数据,因为users_priveleges中的每一行都包含三个Bigint,一个bool和两个日期。
如果您永远不想授予一个用户他们的角色通常不会拥有的权限,那么您可以简单地使用roles_priveleges和users_roles。 这对数据的需求最小,但灵活性却低得多。
我将承认我所描述的方法有点不优雅,但它提供了非常好的基于角色和用户的privelege管理,同时保持DB在第4范式或更高。 恕我直言,值得付出额外的努力,因为你的应用程序有一天会更大,现在更容易添加这些东西而不是更晚。 此外,从初学者的角度来看,创建虚拟数据非常容易,并且在您开始执行某些操作之前确保SQL连接正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.