gpt4 book ai didi

basic-authentication - 使用 Cro 的 perl6 中的基本身份验证

转载 作者:行者123 更新时间:2023-12-04 03:55:57 25 4
gpt4 key购买 nike

我正在寻找一个简单的解决方案来使用 Cro 的基本身份验证机制来保护我的路由。在我的示例中,我希望看到 401 Unauthorized如果您根本不提供任何凭据。如果您提供错误的凭据,我希望看到 403 Forbidden
在我的代码示例中,我从未见过 MyBasicAuth中间件被调用:

class MyUser does Cro::HTTP::Auth {
has $.username;
}

subset LoggedInUser of MyUser where { .username.defined }

class MyBasicAuth does Cro::HTTP::Auth::Basic[MyUser, "username"] {
method authenticate(Str $user, Str $pass --> Bool) {
# No, don't actually do this!
say "authentication called";
my $success = $user eq 'admin' && $pass eq 'secret';
forbidden without $success;
return $success
}
}

sub routes() is export {
my %storage;
route {
before MyBasicAuth.new;
post -> LoggedInUser $user, 'api' {
request-body -> %json-object {
my $uuid = UUID.new(:version(4));
%storage{$uuid} = %json-object;
created "api/$uuid", 'application/json', %json-object;
}
}
}
}

最佳答案

这种结构:

route {
before MyBasicAuth.new;
post -> LoggedInUser $user, 'api' {
...
}
}

取决于新的 before/ after即将推出的 Cro 0.8.0 中的语义。在询问/写作时的当前 Cro 版本中 - 以及之前的版本 - beforeroute block 仅适用于已经匹配的路由。但是,对于旨在影响匹配内容的中间件而言,这为时已晚。在 Cro 0.8.0 之前执行此操作的方法是在服务器级别安装中间件,或者执行以下操作:
route {
before MyBasicAuth.new;
delegate <*> => route {
post -> LoggedInUser $user, 'api' {
...
}
}
}

这确保在考虑任何路由匹配之前应用中间件。这不是那么漂亮,因此即将到来的 0.8.0 中的变化(这也将引入一个 before-matched 具有原始 before 语义)。

最后, forbidden without $success;不会在这里工作。 forbidden sub 是 Cro::HTTP::Router 的一部分并且用于路由处理程序,而中间件不绑定(bind)到路由器(因此您可以决定以不同的方式路由请求,例如,而不会失去使用所有中间件的能力)。 authenticate 的契约(Contract)方法是它返回一个确定应该发生什么的真实值;这不是尝试强制使用不同响应代码的合适位置。

无法匹配像 LoggedInUser 这样的身份验证约束将产生 401。要重写它,添加 after在最外层 route block 映射它:
route {
before MyBasicAuth.new;
after { forbidden if response.status == 401; }
delegate <*> => route {
post -> LoggedInUser $user, 'api' {
...
}
}
}

关于basic-authentication - 使用 Cro 的 perl6 中的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53062118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com