使用异常处理身份验证/授权错误是一种好习惯吗?

时间:2012-09-09 06:19:07

标签: design-patterns exception exception-handling

如果应用程序发现某个用户未经过身份验证/授权执行某项操作,那是否是意料之外的事情?

try {
    if (notAuth())
        throw new UnAuthException();
} catch (UnAuthException e) {
    Log . error(e);
    return false;
}

如果是预期的情况,那么为什么有这么多框架有自己的UnAuthException如果失败的Auth不是例外?

2 个答案:

答案 0 :(得分:4)

取决于范围。

业务逻辑层"用户未经授权/验证"情况是例外,并且应该导致运行时异常,例如(Java代码):

public String salutation(User user) {
  // may lead to a runtime exception if user is not authorized
  return String.format("Hello, %s!", user.getName());
}

User的实施(当然,它是一个界面)将返回用户的姓名或在NonAuthenticatedException中投放getName()

访问控制层中,用户授权/身份验证状态将被视为任何其他正常状态,不应视为异常情况,例如:

if (!user.isAuthenticated()) {
  httpResponse.addHeader("WWW-Authenticate", "Basic realm=\"secure content\"");
}

答案 1 :(得分:1)

是的,通过例外处理身份验证\授权是一种很好的做法,因为:

1)异常是系统不喜欢的异常情况,因此通过异常处理 我们正在对这种情况作出反应。认证和授权例外基本上是安全违规,即系统 异常,应对违规行为是一种好习惯。异常处理框架是 报告违规行为\系统异常的流行机制,因此我们使用此框架对此类情况做出反应。

这就是为什么所有流行的框架(包括.NET)都有Auth。要封装的异常类 错误。