对于具有动态内容的大型网站,我认为这可能是处理它的最佳方式.
例:
好吧,假设我们有一个简单的文件存储站点,用户只能访问他们的数据或其他用户明确共享的数据.
由于这个应用程序非常简单,因为它只提供文件,因此它只有三个数据库表:
Users Table which has columns: UserId <int> PK UserName <varchar> HashedPassword <varchar> Files Table which has columns: FileId <int> PK FileOwnerId <int> FK (this has a foreign key relationship with UserId in the users table) FileName <varchar> MimeType <varchar> FileData <blob> SharedFile reference table which has columns: SharedFileIndex <int> PK FileId <int> FK UserId <int> FK
现在,我们要在数据访问层中定义的一些基本规则是,当用户登录时,他们可以访问他们是其所有者的文件以及其他用户与他们共享的文件.因此,无论是通过存储过程还是构建查询以发送到数据库服务器,我都会确保我的查询只返回他们有权访问的记录.
这里是用户登录时的基本GetUsersFileList SQL查询:
SELECT FileId,FileName,FileType FROM Files WHERE FileOwnerId = @UserId
正如您在此处所见,我们使用参数化查询来获取用户所属的文件.此外,我们还将查询共享文件以及向用户显示.
现在,如果我们假设每个文件都有自己独特的URL,例如:
http://mydomain.com/filehandler.PHP?fileId=123546
然后,当我们尝试获取文件时,我们使用与上面类似的查询来尝试获取文件数据:
SELECT FileName,FileType,FileData FROM Files LEFT OUTER JOIN SharedFiles on Files.FileId = SharedFiles.FileId WHERE Files.FileId = @FileId AND (FileOwnerId = @UserId OR SharedFiles.UserId = @UserId)
因此,我们仍然在查询中使用UserId,因此,如果用户没有与他们共享文件,或者他们不是文件的所有者,则查询结果将为0行.
因此,权限取决于用户在数据库中映射到的内容,但实际执行是通过在提供内容之前在业务逻辑层中仔细编写数据访问代码和/或其他检查来完成的.
EDIT2:我最熟悉MSsql,所以我上面的查询都是在T-sql中,所以MysqL的语法可能有些偏差.
EDIT3:用数据访问层替换了业务逻辑层,如本例中所做的唯一检查是在数据访问查询本身内.
EDIT4:Ok回过头参考业务逻辑层,因为更复杂的应用需要更复杂的权限方案,这可能需要在业务逻辑层进行额外的检查.
原文地址:https://www.jb51.cc/php/137923.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。