假设我们有父进程A
。 A
会重复输入username
和password
,并在AllUsers
数据库中查找它们,以确保username/password
组合有效。然后A
开始新的子流程B
,并将username/password
传递给它。 B
需要来自数据库的更多信息,例如用户的age
和nickname
。
只允许A
拥有数据库访问权限:
A
从中获取所有信息
数据库并将其全部传递给B
via
命令行字符串创建时
新的B
。即使A
没有
关心age
和nickname
。 B
将解析字符串以获取字段。A
只能通过
username/password
到B
,A
有WCF
允许B
调用的服务
服务,使A
访问
数据库并将信息返回B
。 A
和B
是否都可以访问数据库:
A
只手B
username/password
并允许B
访问数据库,以便它可以获得
age/nickname
本身。我们是否应该有多个数据库:
A
只能访问AllUsers
数据库。但我们也有一个数据库
为每个用户。所以,10,000个用户=
10,000个数据库。 B
仅访问
一个用户数据库
用户关心的。请注意,只有一个A
,但可能有数百或数千个B
进程。我希望尽可能保持负载,即如果成千上万A
需要与之交谈,我不希望B
成为瓶颈。但我也担心有两个进程同时访问同一个数据库,似乎可能导致访问速度慢或数据损坏。
这些是我如何解决这个问题的想法。哪一个是最好的?或者有更好的方法吗?
答案 0 :(得分:1)
数据库旨在处理多个同时访问。除非你做了一些奇怪的事情,否则我不明白为什么A和B不应该访问数据库,如果你的主要关注是避免瓶颈。
我会避免为每个用户建一个数据库,因为你可能会在同一台机器上运行很多(如果不是全部)实例。
我建议阅读数据库功能和扩展。
希望这有帮助。
答案 1 :(得分:1)
在我看来,如果可能的话,不应该以任何方式传输用户名和密码,而且在你的场景中似乎很容易避免它。首先,没有进程应该具有对AllUsers
数据库的完全访问权限,因为它保留了安全敏感数据。一种好的方法是使用只有A
有权访问的存储过程,将用户名和密码(哈希)作为参数传递。这样,如果进程A
受到攻击,攻击者就无法简单地获取用户名和密码列表。他/她可以尝试暴力,但如果有足够安全的密码(和适当的监控),你应该有足够的时间来发现事件。如果它们是正确的,则存储过程应返回加密安全的随机会话令牌。这应该是唯一要传递的信息,而你的方式(WCF,命令行参数等)并不重要,选择你喜欢的任何东西。进程B
应该能够通过将令牌作为参数的存储过程查询所需的任何信息,并根据您的需要返回过滤结果。例如,进程B
应该只能读取自己的用户行但没有密码。添加一些最后的工作,如工作,以清除旧会话,你有一个既安全又易于维护的设计。