2014-07-14 182 views
0

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

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

感谢

+0

取决于它是否是业务规则,您可能确实将其放入您的业务逻辑中。 –

回答

0

使用依赖注入校长授权成分并不需要访问该业务数据库,委托了一个“是本公司经营授权”查询的只是注入能力。所以在psuedocode;

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) 
      } 
    } 
} 

以我的伪代码的授权类接受一个I​​AuthorizationExtension实例,其可通过授权类的任何消费者提供的扩展点(dependeny注射)。请注意,如果我们的本地商店无法找到可安全(即要安全检查的项目),那么我们只使用此扩展,所以IAuthorisationExtension的作者不能覆盖我的授权类的决定 - 如果我的授权类说“拒绝访问”,我们不会然后咨询扩展。