我一直在阅读基于声明的身份验证,我理解将身份验证,授权和业务层相互分离是一种很好的做法。我们应该有一个验证组件,一个检查授权的组件,与验证器分开,我们还有一个业务逻辑层。所有这一切都有意义,除了一部分。想象一下,我们有像youtube这样的产品的情况,但用户只能看到他们订阅的人的视频和订阅需要批准。现在,单独的授权组件如何决定是否允许在不访问数据库的情况下获取视频?这不是我们可以提出的索赔。唯一的方法是查看所请求的视频ID是否属于允许(订阅)的视频。
我应该将这些检查放在我的授权组件中的业务逻辑或访问数据库中吗?
由于
答案 0 :(得分:0)
使用依赖注入主体Authorization组件不需要访问业务数据库,只需注入一个委派“是否已授权此操作”查询的功能。所以在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)
}
}
}
在我的伪代码中,Authorization类接受IAuthorizationExtension实例的扩展点(依赖注入),该实例可由授权类的任何使用者提供。请注意,如果我们自己的本地存储无法找到安全性(即要检查安全性的项目),我们只使用此扩展,因此IAuthorisationExtension的作者无法覆盖我的授权类的决定 - 如果我的授权类说“访问被拒绝”,我们不会然后咨询扩展名。