非基于角色的安全性?

Jay*_*Jay 6 database security

这是一个没有实际意义的问题,因为我不再参与这个项目了,但它仍然让我感到烦恼.我想知道是否有人对未来的参考和一般良好的编程实践有更好的想法.

安全的教科书方法是"基于角色的安全".每个屏幕,报告或其他任务都附加到一个或多个角色; 每个用户都被分配到一个或多个角色; 然后每个用户都可以锻炼与他的角色相匹配的屏幕等等.对?

几年前,我带领一个团队开发了一套管理军事技术手册的系统.每本手册都有一个"技术内容管理员",负责编写或编辑它的人; "库存经理",负责跟踪副本并将其运出; 还有一名"行政经理",负责预算,因此决定了书的修订频率,打印的份数,等等.当然,每本书都有很多人会订购副本并阅读它.(因为这是军队,你必须被授权拿到书,安全许可等等.)我们通常不担心实际的读者,而是关心每个管理图书馆的基地的人,但这并不重要.

所以......这些是明显的"角色",但角色与特定的书有关.一个人可能是A书的技术内容经理,B书的行政经理,以及其他50本书的读者.所以我们不能说用户有"角色".每个用户对每本书都有不同的角色.

除此之外,还有更多例行系统级权限:我们有几个系统管理员有权更新systeem中的任何内容,帮助台人员几乎可以看到任何数据但不能更新等等.

我最终创建了这样的数据库.(为了避免进入我们的一些奇怪的术语,我会在这里改变一些字段和表名,这个想法是一样的.)

人(person_id,名称等)

Technical_Manual(manual_id,title,admin_manager_person_id,stock_manager_person_id,content_manager_person_id等)

Authorized_Reader(manual_id,person_id等)

用户(user_id,admin_role等)

我对这个方案并不满意,因为它意味着安全性分为三个表:technical_manual表,authorized_reader表和用户表.但是......我们能做得更干净吗?有更好的想法吗?

cha*_*aos 3

我最近做了一些与此类似的事情,结果看起来像:

Person (person_id, name, etc)

Role (role_id, name [admin manager, stock manager, content manager, authorized reader, etc])

Technical_Manual (manual_id, title, etc)

Technical_Manual_Role (manual_id, person_id, role_id)
Run Code Online (Sandbox Code Playgroud)

此外,在我的系统中,角色大多只是默认权限包,特定操作(读取、编辑、移动、删除等)的用户权限可以根据其角色的基线上下变化。