我一直在阅读有关基于声明的身份验证的文章,我知道将身份验证、授权和业务层彼此分开是一种很好的实践。我们应该有一个进行身份验证的组件,一个检查授权的组件,它独立于身份验证器,我们还应该有一个业务逻辑层。除了一部分之外,所有这些都是有意义的。想象一下,如果我们有一个像youtube这样的产品,但用户只能看到他们订阅的人的视频,订阅需要批准。现在,独立的授权组件如何在不访问数据库的情况下决定是否允许获取视频?这不是我们可以提出索赔的东西。唯一的方法是查看所请求的视频id是否在允许的(订阅的)视频中。
我应该将这些检查放在我的授权组件中的业务逻辑或access数据库中吗?
谢谢
发布于 2014-07-15 16:35:33
使用依赖注入原则,授权组件不需要具有对业务数据库的访问权限,只需注入委托“此操作是否已授权”查询的功能。所以在伪代码中;
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的作者无法覆盖我的授权类的决定-如果我的授权类说“访问被拒绝”,我们就不会咨询扩展。
https://stackoverflow.com/questions/24743604
复制相似问题