假设我有一个管理敏感数据的应用程序,例如客户的健康记录。在取得了很大的成功后,我吸引了许多客户 - 其中一些是名人。我现在有很多员工使用这个应用程序。但是,我想通过允许特权账户经理访问“着名”人员的记录来保护所述“名人”的身份。
此应用程序的数据存储在已经发展多年的关系数据库中。 “客户”表有一个“着名”栏目,用于表示名人记录; 'users'表有一个'特权'列,表示员工可以访问名人的记录;假设两者都是布尔值。
我可以掠夺整个数据层,添加所有查询的where子句;我还必须开始发送一个标志,指示用户是否“特权”。这是一项艰巨的任务,但还有另一种选择吗?
我正在寻求一般性建议,但我的应用程序是在Java平台上编写的。
更新:我熟悉基于角色的访问控制以及用户,群组,角色,权限,权限等如何以良好的规范化方式进行布局,但目前还不是选项。更有可能的是,我将重构和调整当前系统以使用Spring Security等框架。
答案 0 :(得分:2)
这里的一般情况是不同的用户需要访问不同的客户端。根据我的经验,这最好使用角色来实现。可以为不同的用户分配不同的角色。对数据的访问将映射到角色。
在您的情况下,您可能拥有经理角色和员工角色。经理可以访问所有记录。员工只能访问不太敏感的记录。可以通过数据库中的表来管理此关联:例如,role,user_role和client_role。 user_role会将用户映射到角色,client_role会定义哪些角色可以访问客户端信息。
我会谨慎添加您描述的“着名”专栏。危险在于,随着新业务规则的出现,您将发现自己需要更多列,并在数据层中使用新代码来实现此逻辑。当您通过角色管理访问权限时,您就拥有了一种通用机制,即使在短期内可以进行更多工作,也可以更具可扩展性。
答案 1 :(得分:0)
对一般问题的一般回答:研究RBAC(基于角色的访问控制)。在Java中,您可以拥有一些已分配角色的用户类。每个角色都有一组特定权限(可以是枚举)。然后,在每个受保护的操作之前,您必须检查当前用户是否具有相关权限。
答案 2 :(得分:0)
我认为你走的是正确的道路:安全是一个跨领域的关注点"方面"需要以某种方式集中。
要具体回答你的问题,你应该选择框架+ taglibrary ,你提到的那个,Spring Security是一个完美的选择,从长远来看将付出代价。您可能还希望使用 面向方面编程 (AOP)来集中某些方面,因为Spring包含AspectJ。
但仍然需要介绍角色和权限概念 ..请参阅this好文章。