当前位置: 首页 > 知识库问答 >
问题:

如何允许用户在Spring Boot/Spring Security中仅访问自己的数据?

徐俊人
2023-03-14

我有一些rest api,如下所示:

/users/{user_id}
/users/{user_id}/orders
/users/{user_id}/orders/{order_id}

我必须如何保护他们?每个用户只能看到她/他的数据,但管理员可以看到所有数据。

怎样

在会话中的每个方法用户ID等于传递给api的user_id参数之前,我是否检查过?有更好的方法吗?

附言:我使用JWT的Spring安全。

共有3个答案

祁嘉言
2023-03-14

您应该首先选择您的安全策略,您需要的名称“行过滤”,3A(身份验证、授权、审计)概念的授权概念之一。

如果您想实施全面的解决方案,请参阅:

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/domain-acls.html

Spring ACL完全涵盖了“行过滤”、“黑白名单”、“角色库授权”、“ACL继承”、“角色投票人”等概念。。。。

否则,您应该根据想要保护的业务案例保存所有者,并在服务层中过滤它们。

唐麒
2023-03-14

您还可以在服务界面上使用@PreAuthorize。如果您有一个自定义的用户详细信息对象,那么您可以轻松完成。在我的一个项目中,我是这样做的:

@PreAuthorize(value = "hasAuthority('ADMIN')"
        + "or authentication.principal.equals(#post.member) ")
void deletePost(Post post);

顺便说一句,这是在服务接口中。您必须确保添加正确的注释才能使预授权生效。

宫元徽
2023-03-14

在任何@Controller@RestController带注释的bean中,您可以直接使用主体作为方法参数。

    @RequestMapping("/users/{user_id}")
    public String getUserInfo(@PathVariable("user_id") Long userId, Principal principal){
        // test if userId is current principal or principal is an ADMIN
        ....
    }

如果不想在控制器中进行安全检查,可以使用Spring EL表达式。您可能已经使用了一些内置表达式,例如hasRole([角色])。

你可以写自己的表达。

  1. 创建一个bean
    @Component("userSecurity")
    public class UserSecurity {
         public boolean hasUserId(Authentication authentication, Long userId) {
            // do your check(s) here
        }
    }
    http
     .authorizeRequests()
     .antMatchers("/user/{userId}/**")
          .access("@userSecurity.hasUserId(authentication,#userId)")
        ...

好的是,您还可以组合以下表达式:

    hasRole('admin') or @userSecurity.hasUserId(authentication,#userId)
 类似资料:
  • 使用firestore和angularfire2 RC2。 我想要达到的目的是只允许用户访问他们自己的数据。 我从以下规则开始: 然而,只要我添加任何类型的限制性规则,包括甚至只是验证请求,就被授权了。

  • 我需要你对LDAP结构和相关ACL的建议。 我们的LDAP将管理10个(数量可能不同)组织,其中包含用户(总共250个用户),我希望每个组织允许1个用户管理他自己组织的所有用户。用户也将附加到自定义组。 我已经读过: http://www.openldap.org/doc/admin24/access-control.html http://www.openldap.org/faq/data/ca

  • 问题内容: 我希望有 多个 MySQL用户能够发出类似的命令 但是我也希望这些用户中的每一个都只能看到和访问他们 自己的 数据库。 我所能找到的就是如何由DBA创建数据库并将该数据库的特权授予特定用户: 或将所有数据库的特权授予用户: 但是我也不想要,因为它需要扩展和安全。 问题答案: 您可以使用 授予用户名称以开头的所有数据库的用户特权。 这允许测试用户创建限制于以testuser_开头的名称的

  • 我已创建IAM策略并分配给IAM用户。 请查找保险单 我未选中s3 bucket testingbucket00的“阻止新公共bucket策略”。 我尝试登录aws控制台使用IAM用户列出所有桶,但显示"访问为错误"。 我想给IAM用户分配一个桶,请帮忙。

  • 问题内容: 是否可以从函数范围内访问python函数对象属性? 例如让我们 现在,如果要返回_x属性内容“ foo”,则必须是什么?如果有可能(简单) 谢谢 更新: 我也想做以下工作: 更新2: 声明不可能(如果是这种情况),以及为什么,比提供一种方法来伪造它更令人满意,例如使用不同于函数的对象 问题答案: 解 使函数的默认参数之一成为对函数本身的引用。 用法示例: 说明 原始张贴者想要一种不需要