【发布时间】:2020-01-08 14:47:32
【问题描述】:
我有代表用户授权的类(scala 代码):
case class Authorization(
userId: UUID,
permissions: Seq[String],
userRoles: Seq[String],
companyId: UUID
) {
private val policy = new Policy(permissions)
def isAllowed(path: String, action: String): Boolean = policy.isAllowed(path, action)
def isSuperuser: Boolean = userRoles.contains(SuperUser)
}
该类在应用程序中的很多地方都使用,以检查用户是否对特定实体具有特定权限,例如:
authorization.isAllowed(s"some/entity/path/$id", "read")
为了提高可用性并避免直接的字符串操作,我将这些方法封装在更具体的方法中:
def canViewCompany(companyId:UUID)=authorization.isAllowed(s"company/$companyId","read")
def canViewUser(userId:UUID)=authorization.isAllowed(s"user/$userId","read")
def canEditTask(id:UUID)=authorization.isAllowed(....)
....
等等,最多 20 种方法。
Authorization 是否应该包含 canViewCompany() 之类的方法?
此类是否有责任了解每个特定实体检查?
更新: 所以最终的问题是:
- 创建像这样的包装器是个好主意吗
canViewCompany(companyId:UUID)为了提高可用性 上课? - 如果是这样,这些方法应该被替换在
Authorization本身还是 提取到某些服务,例如:PermissionService.canViewCompany(id,authorization)=authorization.isAllowed()?
【问题讨论】:
-
path不是域外的吗?这些权限是否与域或 API 相关?域应该验证这些还是它们应该是应用层的一部分(例如,在应用服务中)?
标签: entity domain-driven-design domainservices ddd-service