我一直想知道是否最好在每个请求中检查数据库的帐户访问权限,还是在会话状态下缓存(例如 ACL)。
我目前的情况并不是特别关键,但我觉得必须注销并重新登录以刷新缓存的凭据会很烦人。我还考虑过使用带有 TTL 的临时数据存储。似乎它可能是两者中最好的。
我一直想知道是否最好在每个请求中检查数据库的帐户访问权限,还是在会话状态下缓存(例如 ACL)。
我目前的情况并不是特别关键,但我觉得必须注销并重新登录以刷新缓存的凭据会很烦人。我还考虑过使用带有 TTL 的临时数据存储。似乎它可能是两者中最好的。
安全方面,最好每次都检查数据库的权限。安全漏洞在于,如果在创建会话后减少用户的权限,他们可能仍会获得比应有的更高级别的访问权限。
如果您在开发周期中足够早,您可以做一些事情来保持安全而无需执行完整的查询。如果您有基于角色的访问控制 (RBAC),您可以存储一个包含用户角色的快速查找表。如果用户的角色在会话期间发生变化,则在查找表中将权限标记为“脏”,从而导致数据库查询新角色。只要用户的角色保持不变,就不需要查询数据库。那么,查找表基本上只是一个标志,如果用户的角色发生变化,您可以在后端设置它。如果粒度不太细,即使对单独的访问控制也可以使用相同的技术。如果是,它开始在您的服务器上变得臃肿。
如果您处于开发周期的后期,或者您更看重简单性而不是性能(简单通常更安全),那么我会每次都查询数据库,除非数据库的负载太重。