在数据库或会话中存储安全性查找?

时间:2011-10-04 19:38:25

标签: .net security session

对于我服务中的每个功能,我都有一个安全查找,以确保用户有权访问该功能。

查询函数的调用方式如下:

SecurityCheck("Insert", "Book", Session.UserID);

查找表看起来像这样:

        | Select All | Select Own | Insert | Update | Delete |
Book    |   true     |    true    |  false |  false |  false |
Author  |   true     |    true    |  true  |  true  |  true  |
...

查找表最终将成为30-40行。

我已经读过复杂的对象不应该存储在会话中。这个对象通常被认为太大而无法存储在我的会话中吗?

每个函数的额外数据库调用会显着减慢我的应用程序吗?存放此表的适当位置在哪里?

1 个答案:

答案 0 :(得分:2)

对于1000个用户,每个用户1k的内存中的30-40行不是那么大,大约500-1000(如果你添加更多的东西)字节。

但是作为缓存的一般规则,你必须平衡内存的使用与速度。在这种情况下,它取决于这些服务的调用频率以及它们的响应时间。 例如,如果您的函数需要1秒,并且它被调用1次/秒,那么您可以使用数据库版本。如果您正确/清洁功能,它不应该影响性能。

如果你的函数需要0.10秒,并且被调用100次/秒,那么我建议使用内存缓存。

注意:上述规则仅适用于内存会话。       - 如果你有一个SQL会话 - 不要把它们放在会话中 - 通过正常的SQL加载它我认为它应该比从DB&反序列化。
      - 如果你有一个会话状态服务器,它将取决于服务器的执行方式,但即使在这种情况下你也可能想从SQL中获取它们,因为仍然会发生序列化

对于这两种情况,另一种选择是将用户权限放在应用程序缓存中。