Cro 用户会话被遗忘
Cro user session gets forgotten
我正在尝试学习 Cro(同时学习 Perl6);)
我的学习应用是基于Cro的文档。我添加了一些确实有效的身份验证,但用户会话会立即被遗忘。
您可以在 https://gitlab.com/ecocode/beaverapp 查看代码
转到登录页面并使用 "user" 和 "pwd" 登录。您将重新路由到 /(表示登录成功),但那里的消息是 "Current user: -"。所以会话丢失了。
Routes.pm6相关部分:
class UserSession does Cro::HTTP::Auth {
has $.username is rw;
method logged-in() {
defined $!username;
}
}
my $routes = route {
subset LoggedIn of UserSession where *.logged-in;
get -> UserSession $s {
content 'text/html', "Current user: {$s.logged-in ?? $s.username !! '-'}";
}
get -> LoggedIn $user, 'users-only' {
content 'text/html', "Secret page just for *YOU*, $user.username()";
}
get -> 'login' {
content 'text/html', q:to/HTML/;
<form method="POST" action="/login">
<div>
Username: <input type="text" name="username" />
</div>
<div>
Password: <input type="password" name="password" />
</div>
<input type="submit" value="Log In" />
</form>
HTML
}
post -> UserSession $user, 'login' {
request-body -> (:$username, :$password, *%) {
if valid-user-pass($username, $password) {
$user.username = $username;
redirect '/', :see-other;
}
else {
content 'text/html', "Bad username/password";
}
}
}
sub valid-user-pass($username, $password) {
# Call a database or similar here
return $username eq 'user' && $password eq 'pwd';
}
}
sub routes(Beaverapp $beaverapp) is export {
route {
# Apply middleware, then delegate to the routes.
before Cro::HTTP::Session::InMemory[UserSession].new;
delegate <*> => $routes;
}
}
我认为问题是由于中间件会话管理不起作用。我应该如何纠正这个问题?或者问题可能是由其他原因引起的?
经过cro irc channel的讨论,这个问题只有在使用https 2的时候才会出现,所以上面的代码是正确的。
您看到的行为确实是由 HTTP/2 堆栈中的 cookie 处理错误引起的。
至于现在,错误已修复,OP post 中的代码可以正常工作。
我正在尝试学习 Cro(同时学习 Perl6);)
我的学习应用是基于Cro的文档。我添加了一些确实有效的身份验证,但用户会话会立即被遗忘。
您可以在 https://gitlab.com/ecocode/beaverapp 查看代码 转到登录页面并使用 "user" 和 "pwd" 登录。您将重新路由到 /(表示登录成功),但那里的消息是 "Current user: -"。所以会话丢失了。
Routes.pm6相关部分:
class UserSession does Cro::HTTP::Auth {
has $.username is rw;
method logged-in() {
defined $!username;
}
}
my $routes = route {
subset LoggedIn of UserSession where *.logged-in;
get -> UserSession $s {
content 'text/html', "Current user: {$s.logged-in ?? $s.username !! '-'}";
}
get -> LoggedIn $user, 'users-only' {
content 'text/html', "Secret page just for *YOU*, $user.username()";
}
get -> 'login' {
content 'text/html', q:to/HTML/;
<form method="POST" action="/login">
<div>
Username: <input type="text" name="username" />
</div>
<div>
Password: <input type="password" name="password" />
</div>
<input type="submit" value="Log In" />
</form>
HTML
}
post -> UserSession $user, 'login' {
request-body -> (:$username, :$password, *%) {
if valid-user-pass($username, $password) {
$user.username = $username;
redirect '/', :see-other;
}
else {
content 'text/html', "Bad username/password";
}
}
}
sub valid-user-pass($username, $password) {
# Call a database or similar here
return $username eq 'user' && $password eq 'pwd';
}
}
sub routes(Beaverapp $beaverapp) is export {
route {
# Apply middleware, then delegate to the routes.
before Cro::HTTP::Session::InMemory[UserSession].new;
delegate <*> => $routes;
}
}
我认为问题是由于中间件会话管理不起作用。我应该如何纠正这个问题?或者问题可能是由其他原因引起的?
经过cro irc channel的讨论,这个问题只有在使用https 2的时候才会出现,所以上面的代码是正确的。
您看到的行为确实是由 HTTP/2 堆栈中的 cookie 处理错误引起的。
至于现在,错误已修复,OP post 中的代码可以正常工作。