如何将AuthMiddleware用于多个实体?

时间:2016-11-27 12:55:48

标签: swift authentication middleware vapor

我尝试将Vapor AuthMiddleware 用于两个实体:客户商家

https://vapor.github.io/documentation/auth/request.html

let auth = AuthMiddleware(user: Customer.self) { value in
                return Cookie(
                    name: "vapor-auth",
                    value: value,
                    expires: Date().addingTimeInterval(60 * 60 * 5),
                    secure: true,
                    httpOnly: true
                )
            }

但是正如我所看到的那样,第一个添加的中间件(Customer)被第二个(商家)取代,如果他们添加了:

drop?.middleware.append(auth)

drop?.addConfigurable(middleware: auth, name: "auth")

因此,如果我尝试使用来自请求的凭据登录:

guard let login = req.data["login"]?.string,
    let password = req.data["password"]?.string else {
        throw Abort.badRequest
}
let credentials = APIKey(id: login, secret: password)
try req.auth.login(credentials)

我有一个错误:

▿ Abort
▿ custom : 2 elements
    - .0 : HTTP.Status.badRequest
    - .1 : "Invalid credentials."

但它仅针对第一个添加的实体抛出,其中AuthMiddleware被其他AuthMiddleware取代......

请告诉我是否可以解决这个问题。 谢谢!

1 个答案:

答案 0 :(得分:2)

您可以这样做:

drop.group(AuthMiddleware()) { authed in
  authed.get("endpoint") { req in
    return ""
  }
}

您放入群组内部(并使用authed创建端点)的任何内容都将使用AuthMiddleware()