我们有一个应用程序,允许用户查看文档列表。
根据用户的角色和文档的属性,我们希望过滤掉列表中的一些文档。例如,我们希望允许用户查看仅包含他创建的文档的列表,以及其余的灰色外线。
此时应用程序执行SQL SELECT命令,该命令返回用户可以看到和不能看到的条目列表。之后我们希望根据用户的权限和角色来限制此结果集。 我们的问题如下:
答案 0 :(得分:0)
您有几个选择: 首先,因为您似乎想要向用户显示完整的文档列表,您仍然需要查询所有文档。 (虽然我在此提醒你,因为泄漏了用户无法访问的信息。例如,用户' jcoder看到一个标题为“超级密码密码”的文件,他知道你有这个文件。这对你的用例可能有问题,也可能没有关系)
如果您的用例仅限于#34;只有作者才能编辑自己的文档"然后你可以只是简单的用户名比较(我猜你现在在做)
大多数用例并非如此简单,并且需要作者以及管理员,技术编写者等访问资源。因此,您可以为资源分配一组权限。我们可以将其称为publications:docs:<document_id>:<action>
,或仅docs:<document_id>:<action>
。其中document_id
是一些唯一的文档标识符,action
对资源执行的操作(在典型的CRUD应用程序中,它们将创建,读取,更新,删除)。
可以将此权限授予任何用户,并且可以向作者授予publications:docs:<document_id>:*
。如果有人更改位置或者文档需要被标记为只读,除了管理员之外的所有用户也是如此,这也允许撤销权限。
代码片段看起来像:
if(SecurityUtils.getSubject().isPermitted("publications:docs:":"+ documentId + ":read" ) {
// do something
}
或者你可以检查他们all at once。
您的应用需要跟踪向用户添加权限。
看看:http://shiro.apache.org/permissions.html
还有一个类似的问题:Java – efficient, database-aware instance-level authorization?