授权验证应该在控制器还是业务逻辑中
Should authorization validation be in the controller or business logic
我有一个内部 CRM 系统,可以让客户查看他们的发票。
函数中的第 5 行检查发票是否属于已登录的客户 (if (invoice.CustomerId != loggerInCustomerId))。
我不确定这里是否应该进行检查。
public ActionResult ViewInvoice(Guid invnum)
{
int loggerInCustomerId = GetTheLoggedInCustomerId();
Invoice invoice = _invoiceLogic.GetInvoice(invnum);
if (invoice.CustomerId != loggerInCustomerId)
{
//Invalid Action
return RedirectToAction("Index", "MyInvoices");
}
//do other stuff as normal
}
这个检查是否应该移到业务逻辑中? GetInvoice 将接受发票编号参数和登录用户的参数。 GetInvoice 然后会执行此检查并抛出异常,我会在我的操作方法中有一个 Try Catch。
或者有更好的方法吗?
Should this check be moved into the business logic?
是的,您可以,在这种情况下,您会将登录的用户身份传递给 BL 方法调用。但是我认为将此检查保留在您的控制器本身中没有任何问题。
无论如何,您通过调用 GetInvoice()
从您的 BL 获取发票,然后进行检查以查看要采取的操作,因此对我来说,将此检查保留在您的 [=11] 中很有意义=] 而不是在业务层中。
但是,是的,这是一个有争议的问题。
我有一个内部 CRM 系统,可以让客户查看他们的发票。
函数中的第 5 行检查发票是否属于已登录的客户 (if (invoice.CustomerId != loggerInCustomerId))。
我不确定这里是否应该进行检查。
public ActionResult ViewInvoice(Guid invnum)
{
int loggerInCustomerId = GetTheLoggedInCustomerId();
Invoice invoice = _invoiceLogic.GetInvoice(invnum);
if (invoice.CustomerId != loggerInCustomerId)
{
//Invalid Action
return RedirectToAction("Index", "MyInvoices");
}
//do other stuff as normal
}
这个检查是否应该移到业务逻辑中? GetInvoice 将接受发票编号参数和登录用户的参数。 GetInvoice 然后会执行此检查并抛出异常,我会在我的操作方法中有一个 Try Catch。
或者有更好的方法吗?
Should this check be moved into the business logic?
是的,您可以,在这种情况下,您会将登录的用户身份传递给 BL 方法调用。但是我认为将此检查保留在您的控制器本身中没有任何问题。
无论如何,您通过调用 GetInvoice()
从您的 BL 获取发票,然后进行检查以查看要采取的操作,因此对我来说,将此检查保留在您的 [=11] 中很有意义=] 而不是在业务层中。
但是,是的,这是一个有争议的问题。