我正在研究一个项目,并想知道以下场景的最佳实践是什么?
我正在开发一个需要用户访问控制的应用程序。当用户启动应用程序时,系统将提示他们输入用户名和密码。该应用程序的设计使得用户将根据他们来自哪所学校连接到不同的数据库。因此,每所学校都将拥有不同的数据库地址。那么,我也会在登录提示时询问用户数据库网址吗?
另外,如何重新严格访问数据库以仅允许该应用程序访问数据库?例如,您无法启动其他应用程序并尝试使用相同的用户名和密码连接到该数据库,因为它不是正确的应用程序?
谢谢,如果您需要我进一步解释,请告诉我。
更多细节:
学校列表不会在编译时设置。学校会选择使用该应用程序,然后建立一个使用该软件的数据库,然后他们的学生将使用该应用程序。因此,没有最初的学校名单。你有什么建议来解决这个问题?
每个学校的主持人都有自己的服务器。
答案 0 :(得分:1)
您可以使用他们将用于身份验证的密码而不是要求用户选择或输入相应的数据库地址,而是让用户在相应的学校数据库上使用相同的密码并使用有限的权限(例如,更新,插入等等,不给予丢弃或删除)。因此,根据所选择的学校,将选择相应的数据库URL(硬编码或从配置文件加载),输入的密码将用于连接,如果正确,则将成功连接到数据库。
虽然这不能解决使用相同凭据访问数据库的其他应用程序的第二个问题。如果我考虑一下,会更新答案。
答案 1 :(得分:1)
没有必要为每个学校做一个不同的数据库,甚至不需要另外一个表。
你可以使用像
这样的表格school -- all schools with data belonging to that school.
------------
id integer primary key auto_increment
name varchar(255)
unique index idx_school (name)
user -- all users from all schools in one table.
--------
id integer primary key auto_increment
username varchar(255)
passhash varchar(200) -- hashed and salted password
salt varchar(10) -- salt used, not encrypted, but different per user.
school_id integer not null foreign key references school(id)
unique index idx_user (username, school_id)
使用以下选择用户:
SELECT u.id FROM user u
INNER JOIN school s ON (s.id = u.school_id)
WHERE s.name = :schoolname
AND u.name = :username
AND u.passhash = SHA2(CONCAT(salt,:password),512)
:....
是您的参数。