文章总结: 该文档是SDL序列课程第66篇,聚焦安全需求中的权限设计需求,重点阐述水平权限控制。核心要点是用户只能访问自己拥有授权的数据,防止访问同等权限其他用户的数据。文章介绍了水平权限控制的重要性、实现方法(如业务逻辑添加所有者检查或使用访问控制列表ACL),并给出了Java与Spring框架的代码示例。同时提出了实施注意事项,包括避免仅在前端检查、处理权限失败、考虑性能与数据一致性等。 综合评分: 78 文章分类: 安全开发,安全建设,应用安全,渗透测试,代码审计
SDL序列课程-第66篇-安全需求-权限设计需求-水平权限:对数据的访问加拥有者判断,用户只能访问自己拥有授权的数据
原创
wenson wenson
软件开发安全生命周期
2026年2月23日 21:53 广东
欢迎转发给有需要的人,微信公众号名称:软件开发安全生命周期。定期分享软件开发生命周期,SDLC、SDL、DevSecOps等相关的知识。致力于分享知识、同时会分享网络安全相关的知识点和技能点。
水平权限控制:对数据的访问加拥有者判断,用户只能访问自己拥有授权的数据,防止用户访问到和自己同等权限的其他用户数据
1. 引言
在构建Web应用时,通常需要对用户的访问权限进行控制。这种权限控制通常可以分为两个维度:垂直权限控制和水平权限控制。垂直权限控制是指根据用户的角色来控制他们可以访问的功能,比如管理员可以访问管理界面,而普通用户则不能。而水平权限控制是指根据数据的所有者来控制谁可以访问这些数据,即用户只能访问他们自己创建的数据,而不能访问其他人创建的数据。本文将重点讨论如何实现水平权限控制,以及在实施过程中应注意的一些问题。
2. 为什么需要水平权限控制?
水平权限控制是一种重要的安全措施,可以防止用户访问到他们不应该访问的数据。例如,如果你的应用允许用户创建和管理他们自己的项目,那么你应该确保用户只能访问他们自己的项目,而不能访问其他用户的项目,即使他们知道其他项目的URL。如果没有正确的水平权限控制,恶意用户可能会试图访问其他用户的数据,这可能导致数据泄露或数据篡改。
3. 如何实现水平权限控制?
实现水平权限控制的一种常见方法是在业务逻辑中添加所有者检查。例如,当用户请求访问某个项目时,你可以检查请求的用户是否是项目的所有者。如果是,那么允许访问;如果不是,那么拒绝访问。
以下是一个使用Java和Spring框架实现的简单示例。在这个示例中,我们假设有一个Project类,它代表一个项目,有一个User类,它代表一个用户,以及一个ProjectRepository类,它用于从数据库中获取项目。
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
@Service
publicclassProjectService {
@Autowired
privateProjectRepositoryprojectRepository;
publicProjectgetProject(longprojectId, UsercurrentUser) {
Projectproject=projectRepository.findById(projectId);
if (project==null) {
thrownewNotFoundException("Project not found.");
}
if (!project.getOwner().equals(currentUser)) {
thrownewUnauthorizedException("You do not have permission to access this project.");
}
returnproject;
}
}
在这个例子中,getProject方法接受一个项目ID和当前用户作为参数。然后,它从数据库中获取项目,并检查项目的所有者是否是当前用户。如果是,那么返回项目;如果不是,那么抛出一个未授权的异常。
这个示例只是最基本的水平权限控制。在实际的应用中,你可能需要处理更复杂的情况。例如,你可能需要支持用户之间共享项目,或者你可能需要支持更细粒度的权限,比如用户可以查看项目但不能修改项目。
为了处理这些复杂的情况,你可能需要使用访问控制列表(ACL)。ACL是一种数据结构,可以用来表示用户对资源的访问权限。例如,你可以为每个项目创建一个ACL,列出可以访问该项目的所有用户,以及他们的访问级别(如查看、编辑或删除)。
以下是一个使用Java和Spring Security框架实现的ACL示例:
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.security.acls.model.MutableAcl;
importorg.springframework.security.acls.model.MutableAclService;
importorg.springframework.security.acls.model.ObjectIdentity;
importorg.springframework.security.acls.model.ObjectIdentityImpl;
importorg.springframework.security.acls.model.Permission;
importorg.springframework.security.acls.model.Sid;
importorg.springframework.security.acls.model.StatelessSessionBasedAclService;
importorg.springframework.security.acls.domain.BasePermission;
importorg.springframework.security.acls.domain.GrantedAuthoritySid;
importorg.springframework.security.acls.domain.PrincipalSid;
importorg.springframework.stereotype.Service;
@Service
publicclassAclService {
@Autowired
privateMutableAclServicemutableAclService;
publicvoidaddPermission(Projectproject, Useruser, Permissionpermission) {
ObjectIdentityoid=newObjectIdentityImpl(Project.class, project.getId());
MutableAclacl;
try {
acl= (MutableAcl) mutableAclService.readAclById(oid);
} catch (NotFoundExceptionnfe) {
acl=mutableAclService.createAcl(oid);
}
Sidsid=newPrincipalSid(user.getUsername());
acl.insertAce(acl.getEntries().size(), permission, sid, true);
mutableAclService.updateAcl(acl);
}
}
在这个例子中,addPermission方法接受一个项目、一个用户和一个权限作为参数。然后,它创建一个代表该项目的ObjectIdentity,并尝试从MutableAclService中获取该项目的ACL。如果没有找到,那么创建一个新的ACL。然后,它创建一个代表该用户的Sid,并在ACL中添加一个新的访问控制项,表示该用户有该权限。最后,它更新ACL。
4. 在实现水平权限控制时应该注意的问题
虽然添加所有者检查或使用ACL是实现水平权限控制的一种方法,但在实践中,还需要注意以下一些问题:
- 避免在前端进行权限检查:虽然在前端进行权限检查可以提高用户体验,但你不应该只在前端进行权限检查。因为恶意用户可以修改前端代码或直接发送HTTP请求,绕过你的前端权限检查。应该始终在后端进行权限检查。
- 处理权限检查失败:当权限检查失败时,返回一个适当的错误消息,告诉用户他们没有访问权限。避免在错误消息中透露过多的信息,因为这可能会帮助攻击者找到攻击的方法。
- 考虑使用访问控制列表(ACL):应用需要支持更复杂的权限模型,比如允许用户分享他们的项目给其他用户,那么你可能需要使用访问控制列表(ACL)。ACL是一种数据结构,可以用来表示用户对资源的访问权限。
- 考虑性能:在实现水平权限控制时,需要考虑性能。如果每次用户请求访问某个资源时,从数据库中获取该资源的所有者或ACL,那么这可能会导致性能问题。为了提高性能,可能需要使用缓存或其他优化技术。
- 考虑数据一致性:应用允许用户共享他们的数据给其他用户,那么你需要确保在用户更改他们的数据的所有者或ACL时,所有的相关数据都能正确地更新。这可能需要使用事务或其他数据一致性技术。
5. 结论
水平权限控制是一种重要的安全措施,可以防止用户访问他们不应该访问的数据。实现水平权限控制通常需要在业务逻辑中添加所有者检查,或者使用访问控制列表(ACL)。还需要注意一些问题,比如避免在前端进行权限检查,正确处理权限检查失败,考虑性能和数据一致性,以及考虑使用ACL来支持更复杂的权限模型。才能确保我们的应用既方便用户使用,又不会带来安全风险。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:软件开发安全生命周期 wenson wenson《SDL序列课程-第66篇-安全需求-权限设计需求-水平权限:对数据的访问加拥有者判断,用户只能访问自己拥有授权的数据》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论