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

5
如果应用程序发现某个用户未经认证/授权就做了某些事情,这是否属于意外情况?
try {
    if (notAuth())
        throw new UnAuthException();
} catch (UnAuthException e) {
    Log . error(e);
    return false;
}

如果这是一个预期情况,为什么会有这么多框架有它们自己的UnAuthException,如果失败的身份验证不算异常的话?

2个回答

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(当然,它是一个接口)将返回用户名称或在getName()中抛出NonAuthenticatedException

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

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

谢谢,是的,那很有道理,但在第一个例子“业务逻辑”中,异常应该放在哪里?您能否通过包括抛出异常的代码和处理它的代码来扩展示例?对不起,我有点困惑。 - Abdullah
1
我已经更新了我的回答。User 是一个接口,将被实现为一个经过身份验证的用户,从 getName() 返回其名称,或者是抛出异常的匿名用户。 - yegor256

1

是的,通过异常处理来处理身份验证\授权是一个好的实践,因为:

1)异常是系统不喜欢的异常情况,因此通过异常处理我们正在对这种情况做出反应。身份验证和授权异常基本上是安全违规,即系统异常,对违规进行响应是一个好的实践。异常处理框架是报告违规\系统异常的流行机制,因此我们使用该框架来对此类情况做出反应。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接