raku - Cro 用户 session 被遗忘

标签 raku cro

我正在尝试学习 Cro(和 Perl6 同时);)

我的学习应用程序基于 Cro 的文档。我添加了一些确实有效的身份验证,但用户 session 会立即被遗忘。

您可以在 https://gitlab.com/ecocode/beaverapp 查看代码
转到登录页面并使用“user”和“pwd”登录。您将重新路由到/(表示登录成功),但是那里的消息是“当前用户:-”。所以 session 丢失了。

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;
    }
}

我认为问题是由于中间件 session 管理不起作用。我应该如何纠正这个问题?或者问题可能是由于其他原因造成的?

最佳答案

您看到的行为确实是由 HTTP/2 堆栈内部 cookie 处理中的错误引起的。

目前,该错误已修复,并且 OP 帖子中的代码有效。

关于raku - Cro 用户 session 被遗忘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51451841/

相关文章:

raku - Cro:如何在 .cro.yml 中为每个服务定义端口?

raku - 如何在 Perl 6 中声明固定大小的原生数组?

mysql - 在 rakudo-star docker 镜像上安装带有 DBIish 的 mysql 的安装要求

raku - 使用从文件加载的定义启动 REPL

raku - 为什么我的 promise (启动 block )中的所有 shell 进程都没有运行? (这是一个错误吗?)

raku - 如何在 cro 中的两个路由器模块之间共享变量?

raku - nativecast() 是否创建一个新容器?

raku - 使用 Cro run 重建更改的客户端文件

Raku Cro 服务订阅数据 "in the background"一般指导