Spring Security 基于用户的权限? (不基于角色)

Posted

技术标签:

【中文标题】Spring Security 基于用户的权限? (不基于角色)【英文标题】:Spring security user based permission? (not role based) 【发布时间】:2020-12-18 03:50:45 【问题描述】:

假设我有一个由用户和项目组成的数据库。用户与项目具有一对多的关系。用户可以使用 REST 端点进行操作。

问题是: 如何验证 this 用户拥有 this 资源?

我不希望恶意用户更改 ID,然后突然查看另一个人的项目详细信息/图像/等。把它想象成社交媒体(我的应用不是社交媒体,而是试图说明问题):尽管具有相同的“状态”,但您只能查看自己的图像,而不能查看其他人的图像。

大多数 spring-security 在线博客都使用基于角色的方法。在这种情况下,我什至不知道要搜索什么(尝试了多个搜索查询均无济于事)。

一个选项是对每个资源请求/操作运行某种多连接查询,直到我达到该资源 ID 并检查它的拥有用户以检查它是否是登录用户。但是,我不确定这种方式是否有效,因为实际应用程序中的链中有多个表(如果我手动使用这种方式,可能会有很多连接;例如:用户-> 项目-> 任务列表-> .. . -> 注意;删除笔记会触发大链)或如何让“授权人”使用它。

我有什么选择?

如果它很重要: 我正在使用 spring-boot + hibernate/JPA + spring-security

【问题讨论】:

【参考方案1】:

Spring Security 有以下几个概念:

身份验证:

证明一个演员就是它所保证的那个人。身份验证使用凭据完成,其中凭据可以采用任意数量的形式 - 用户名/密码、令牌、硬件密钥等。

您可以使用一组可接受的身份验证提供程序设置 Spring Security。

授权:

给定一个经过身份验证的用户,决定该用户是否有权访问给定的资源。资源可以在哪里:

HTTP 端点。 Java 方法。 对象的属性。

您在这里要做的是提供自定义授权方案。

您可以阅读 Spring Security 的授权架构here,包括如何设置自定义授权。准备好后,您可以随时提出具体问题。

【讨论】:

如果我听起来像个新手(我是),请原谅我。在阅读了有关该主题的更多信息后,我必须制定自己的自定义授权决定方法。我是否在该方法中进行查询(通过调用服务)?此外,由于有不同的资源(图像和一些其他可由用户操作的实体),这是否意味着我必须为每个资源定义一个?最后,如果您碰巧有关于实施的资源,那就太好了。 这个spring blog article 可以作为更好的春季安全入门。

以上是关于Spring Security 基于用户的权限? (不基于角色)的主要内容,如果未能解决你的问题,请参考以下文章

基于Spring LDAP和Spring Security的用户认证和权限控制Web实现

Spring Boot Security

基于Spring Boot+Security+Redis权限管理系统,权限控制采用RBAC

基于RBAC的权限控制浅析(结合Spring Security)

基于RBAC的权限控制浅析(结合Spring Security)

基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践