manageable-users/Sources/ManagableUsers/Middleware/RoleMiddleware.swift

36 lines
1.0 KiB
Swift

import Vapor
public struct RoleMiddleware<User: ManagedUser>: AsyncMiddleware {
private let role: String
public init (role: String) {
self.role = role
}
public func respond (to request: Request, chainingTo next: any AsyncResponder) async throws -> Response {
guard let user = request.auth.get (User.self),
user.roles.contains (role) else {
return request.redirect(to: try Environment.baseURL.absoluteString)
}
return try await next.respond (to: request)
}
}
public struct RoleAPIMiddleware<User: ManagedUser>: AsyncMiddleware {
private let role: String
public init (role: String) {
self.role = role
}
public func respond (to request: Request, chainingTo next: any AsyncResponder) async throws -> Response {
let user = try request.auth.require (User.self)
guard user.roles.contains (role) else {
throw Abort (.forbidden)
}
return try await next.respond (to: request)
}
}