在设计基于活动的授权系统时,应该如何处理额外的条件检查?
例如,我有以下权限:
VIEW_COMPANY_TRANSACTIONS
允许用户点击端点
GET /company/{companyName}/transactions
但是,如果我的权限VIEW_COMPANY_TRANSACTIONS
根据活动参数有其他限制,实际上有效地授权VIEW_COMPANY_TRANSACTIONS(companyName=company_a)
,那该怎么办?我不想将这些信息编码到权限系统中,最终得到以下新权限:
VIEW_COMPANY_TRANSACTIONS_FOR_COMPANY_A
上述权威似乎混淆了对观点和权威本身的过滤,这使得一切都变得有些乏味和不灵活。
在另一个例子中,我有以下权限:
APPROVE_TRANSACTION
允许用户点击端点:
POST /company/{companyName}/transactions/{id}/approvals
但是,如果只有在transaction.amount < maxAmount
的情况下才能进行批准,那么将其编码为新的硬编码权限就更难了。
请注意,这些权限也可能包含在JWT令牌中,因此它们也必须可转移。
设计这样一个系统的最佳方法是什么?有什么提示吗?
答案 0 :(得分:1)
我可以建议你两种不同的方式:
为您的安全框架编写自定义过滤器。为/company/{companyName}/**
等网址设置预身份验证过滤器,该过滤器将使用用户对当前公司的所有权限填充您的上下文或令牌。
如果您有用于提取权限的复杂逻辑(例如,用户可以查看事务还是否),则可能最好将其移至服务层并在执行主逻辑之前按需检查权限。
每个现代安全框架都支持过滤器或类似的东西,因此您应该尝试使用第一个选项。