2016-12-19 57 views
0

最近我一直在处理Sring安全性,试图以我自己的方式来定制它。例如,我设法将我的授权逻辑引入到请求的执行流程中,以告诉当前用户是否有权调用某种方法。我已经通过注入一个PreInvocationAuthorizationAdvice对象来完成它的调用,并且我可以告诉程序是否应该继续。PreInvocationAdvice用于身份验证

现在我想要做同样的认证。我想注入我的代码(不知何故,在某处),我会被问到某些特定方法是否需要身份验证。我知道我可以在WebSecurityConfigurerAdapter.configure通过调用antMatchers,regexMatchers等来做到这一点。但我宁愿这样做,而不是分组网址。

有没有办法做到这一点?

+0

你为什么宁愿这样做,在个案。通常,您使用匹配逻辑来指定哪些端点需要身份验证,以及可能使用哪些授权(角色)。您也可以使用@PreAuthorize(“hasRole('ROLE_USER')”),在这两种情况下,关键是在实例化身份验证时创建正确的GrantedAuthority列表。 –

+0

我明白,但我有我自己的ACL(认证+授权)系统,我试图与Spring融合。为了做到这一点,我需要找到注入我的代码的正确位置。我设法找到授权部分的正确位置('PreInvocationAuthorizationAdvice.before'),我正在寻找正确的认证地点。 – Mehran

+0

访问控制列表并不是一件容易实现的事情,它是数据库的一部分(它是否限制了数据的可见性)还是外部的?在将数据可见性链接到用户的CMS系统中,不能单独使用声明性安全性,通常需要查找用户权限,并在查询中包含一些ID以确保只加载用户可以看到的内容。 –

回答

1

它几乎听起来像你正在把ACL当作可以在不同数据集上重用的一个方面来处理,如果这是我不确定它的存在的假设。

上次我建立了一个包含权限的大系统,模型就像这样。

  • 你有很多用户
  • 你有一些资源
  • 的你有一些能够对资源进行操作的。
  • 可以定义定义不同的权限集角色(组操作)
  • 你有一些项目
  • 的资源由项目范围的(他们有一个专案编号)
  • 一个用户分配为零或更多角色(映射)
  • 用户对资源的访问取决于拥有资源的项目中的用户角色(这可以在运行时更改)。

如果用户U想要删除资源A,则需要找出项目资源A所属的项目,并且如果U的有效权限集合(加入所有角色U可能在项目中)包含“删除资源”特权。

编写SQL/JPA查询时,您需要非常小心后端,因为您永远不会信任客户端。这意味着你不能发布projectId和resourceId,你总是必须以resourceId开头,查看它属于哪个项目,然后检查是否允许该操作。

如果您具有“查看全部”功能,允许用户跨项目查看所有资源,并且用户可以在5个项目中的3个中查看资源,则需要询问安全模型以获取用户拥有的项目列表View Resource特权,然后将这些projectIds添加到查询以加载数据。 projectIds需要进入查询,就像排序和分页参数一样。通常,您需要两个查询,因为您还需要计数查询来计算总页数。

根据我的经验,数据模型和ACL完全交织在一起。如果你想让ACL实现独立于数据模型,我担心你最终会遇到一个效率低下的系统,它需要加载太多的数据,然后根据权限过滤掉资源。或者你最终会遇到一个过于复杂的系统,因为你需要一种通用的方式将你的ACL逻辑转移到资源加载查询中(并且在我描述的系统中,它们并不简单)。

可能比我描述的通用ACL实现能够工作的系统更简单,但不是我在过去8年中实施的企业内容。

+0

感谢您的深入描述。这不是回答我的问题,而是我想评论的一些话题。我想到的ACL模型有点不同。首先,您只有一个分组概念(角色),您可以将其用于分组资源(如果用户可以拥有多个角色,您也可以使用它来分组用户)。但我更喜欢两个分组概念,一个用于资源,另一个用于用户。然后,多对多关系将设置哪个角色可以访问哪个资源。这样用户与资源相关。你可以在我之前给出的文章中阅读它。 – Mehran

相关问题