我有一些rest api,如下所示:
/users/{user_id}
/users/{user_id}/orders
/users/{user_id}/orders/{order_id}
我必须如何保护他们?每个用户只能看到她/他的数据,但管理员可以看到所有数据。
怎样
在会话中的每个方法用户ID等于传递给api的user_id参数之前,我是否检查过?有更好的方法吗?
附言:我使用JWT的Spring安全。
您应该首先选择您的安全策略,您需要的名称“行过滤”,3A(身份验证、授权、审计)概念的授权概念之一。
如果您想实施全面的解决方案,请参阅:
https://docs.spring.io/spring-security/site/docs/3.0.x/reference/domain-acls.html
Spring ACL完全涵盖了“行过滤”、“黑白名单”、“角色库授权”、“ACL继承”、“角色投票人”等概念。。。。
否则,您应该根据想要保护的业务案例保存所有者,并在服务层中过滤它们。
您还可以在服务界面上使用@PreAuthorize。如果您有一个自定义的用户详细信息对象,那么您可以轻松完成。在我的一个项目中,我是这样做的:
@PreAuthorize(value = "hasAuthority('ADMIN')"
+ "or authentication.principal.equals(#post.member) ")
void deletePost(Post post);
顺便说一句,这是在服务接口中。您必须确保添加正确的注释才能使预授权生效。
在任何@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([角色])。
你可以写自己的表达。
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: 声明不可能(如果是这种情况),以及为什么,比提供一种方法来伪造它更令人满意,例如使用不同于函数的对象 问题答案: 解 使函数的默认参数之一成为对函数本身的引用。 用法示例: 说明 原始张贴者想要一种不需要