【问题标题】:Separating business logic layer and security logic layer分离业务逻辑层和安全逻辑层
【发布时间】:2014-09-04 18:53:08
【问题描述】:

我一直在阅读有关基于声明的身份验证的内容,并且我知道将身份验证、授权和业务层相互分离是一种很好的做法。我们应该有一个验证组件,一个检查授权并与验证器分开的组件,我们还有一个业务逻辑层。除了一部分之外,所有这些都是有道理的。想象一下,我们有一个像 youtube 这样的产品,但用户只能看到他们订阅的人的视频,并且订阅需要批准。现在,这个单独的授权组件如何在没有访问数据库的情况下决定是否允许获取视频?这不是我们可以提出索赔的东西。唯一的方法是查看请求的视频 ID 是否在允许(订阅)的视频中。

我应该将这些检查放在业务逻辑中还是在我的授权组件中访问数据库?

谢谢

【问题讨论】:

  • 根据是否是业务规则,您可能确实将其放入业务逻辑中。

标签: .net security business-logic


【解决方案1】:

使用依赖注入主体,授权组件不需要访问业务数据库,只需一个注入的能力来委派“此操作是否授权”查询。所以在伪代码中;

class Authorization()
{
     public enumCheckAccessResult IsAuthorized(IIdentity userIdentity, ISecurable itemToCheckForAccess IAuthorizationExtension extension)
     {
          enumCheckAccessResult result = checkMyLocalAuthorisationStore(userIdentity, itemToCheckForAccess);
          if(result == enumAccessCheckResult.SecurableNotFound)
          {
               result = extension.CheckExternalAuthorisationStore(userIdentity, itemToCheckForAccess)
          }
     }
}

在我的伪代码中,授权类接受 IAuthorizationExtension 实例的扩展点(依赖注入),该实例可由授权类的任何使用者提供。请注意,如果我们自己的本地商店找不到安全的(即要进行安全检查的项目),我们只使用此扩展,因此 IAuthorisationExtension 的作者无法覆盖我的授权类的决定 - 如果我的授权类说“访问被拒绝”我们不然后查阅扩展程序。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2016-08-12
    • 1970-01-01
    • 2011-12-03
    • 2011-11-26
    • 2017-04-29
    • 2011-08-17
    • 2013-02-18
    • 2017-08-08
    相关资源
    最近更新 更多