使用 Dancer 和 Postgres 的简单登录/授权系统

2024-03-05

作为 Perl 的新手,我正在努力寻找一种简单的方法来做到这一点。我在数据库中创建了一个非常简单的表:

CREATE TABLE users (
id SERIAL NOT NULL PRIMARY KEY, 
username TEXT NOT NULL, 
password TEXT NOT NULL);

到目前为止,我使用了一个简单的登录系统,该系统具有我在网上找到的硬编码用户名和密码:

package Example;
use Dancer ':syntax';

our $VERSION = '0.1';
set session => "Simple";

get '/' => sub {
    # template 'index',{},{layout => 0};
    template 'index';
};

before sub {
    if (! session('user') && request->path_info !~ m{^/login}) {
        var requested_path => request->path_info;
        request->path_info('/login');
    }
};

get '/login' => sub {
    # Display a login page; the original URL they requested is available as
    # vars->{requested_path}, so could be put in a hidden field in the form
    template 'login', { path => vars->{requested_path} }, {layout => 0};
};

post '/login' => sub {
    # Validate the username and password they supplied
    if (params->{user} eq 'user' && params->{pass} eq 'letmein') {
        session user => params->{user};
        redirect params->{path} || '/';
    } else {
        redirect printf 'login failed';
    }
};

get '/logout' => sub {
  session->destroy;
  redirect '/';
};

如何开始链接数据库,然后将用户输入的内容与数据库中的内容进行匹配?我什么时候实施密码的散列?任何教程将不胜感激 - 我一直在使用metacpan,但它没有提供我需要的详细信息!


Dancer::Plugin::Auth::Extensible https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible为您处理大量样板代码。您可以启动并运行一个简单的登录系统,而无需编写任何自己的系统/login路线如下。

配置Dancer::Plugin::Auth::Extensible

Install Dancer::Plugin::Database https://metacpan.org/pod/Dancer::Plugin::Database and Dancer::Plugin::Auth::Extensible::Provider::Database https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible::Provider::Database并将其添加到config.yml:

session: "YAML"

plugins:
  Auth::Extensible:
    realms:
      users:
        provider: 'Database'
        disable_roles: 1

配置数据库连接

配置您的数据库连接environments/development.yml这样您就可以为开发和生产提供不同的配置。这就是 MySQL 的配置,连接凭据(数据库名称、主机、用户名和密码)存储在单独的选项文件中database.cfg:

plugins:
  Database:
    dsn: 'dbi:mysql:;mysql_read_default_file=/path/to/database.cfg'
    dbi_params:
      RaiseError: 1
      AutoCommit: 1

对于 Postgres,您应该使用.pgpass http://www.postgresql.org/docs/9.4/static/libpq-pgpass.html文件来存储您的连接凭据。确保该文件不可读。看这个堆栈溢出帖子 https://stackoverflow.com/a/19980156/176646举个例子。测试您的凭据文件是否可以在命令行上运行并且您的网络服务器可以读取它。

您现有的表似乎符合建议的模式 https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible::Provider::Database#SUGGESTED-SCHEMA在文档中,但即使没有,您也可以调整表和列名称配置 https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible::Provider::Database#CONFIGURATION.

锁定你的路线

Add the require_login关键字到您想要保护的路由。 A/login路线将通过基本登录表单自动生成,尽管您可以创建你自己的 https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible#Replacing-the-Default-login-and-login-denied-Routes如果你喜欢。

lib/MyApp.pm

package MyApp;
use Dancer ':syntax';

use Dancer::Plugin::Auth::Extensible;

our $VERSION = '0.1';

get '/' => require_login sub {
    template 'index';
};

true;

(是的,这确实是您必须编写的所有代码。我告诉过您它会处理很多样板文件。)

Crypt::SaltedHash https://metacpan.org/pod/Crypt::SaltedHash用于自动散列密码。请注意,您永远不应该在数据库中存储明文密码;当您将用户添加到数据库时,您应该生成密码的哈希值并存储该哈希值。

请注意,在此示例中角色被禁用。如果您启用角色,您可以做其他有趣的事情 https://metacpan.org/pod/Dancer::Plugin::Auth::Extensible#Keywords就像只允许具有管理员角色的用户查看管理页面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Dancer 和 Postgres 的简单登录/授权系统 的相关文章

  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 如何对 Data::Dumper 的输出进行排序?

    我想转储对象和散列的值 但它总是乱序打印键 如何按 递归 排序顺序转储键 use Data Dumper print Dumper obj Set Data Dumper Sortkeys 1获取 Perl 的默认排序顺序 如果要自定义顺序
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • java -postgresql 最后插入的 id 插入时未获取

    我有一个插入功能postgresql如下 CREATE OR REPLACE FUNCTION insert orderhead order id integer order dt text customer id integer rout
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • Perl:测试输入阅读器?

    有没有一种方法可以使用标准 Test 等模块自动测试 Perl 程序是否正在读取输入 例如标准输入正确吗 例如 测试一个从 STDIN 读取两个整数并打印它们之和的程序 这不是 100 清楚你的意思 我会回答假设你想编写一个测试脚本来测试你
  • 使用 PostGIS 拥有通用 GEOGRAPHY 列

    在 PostgreSQL 9 PostGIS 1 5 中 有没有办法创建 通用 GEOGRAPHY 列 我指的是接受 POINT 以及 POLYGON LINESTRING 等的列 到目前为止 我只在 Internet 上看到过像 GEOG
  • PostgreSQL 错误 42501:架构权限被拒绝

    我正在 ASP NET 中构建一个用户注册系统 使用 PostgreSQL 数据库来维护用户信息 作为注册过程的一部分 用户会收到一条确认消息 他们必须单击其中的链接来验证其电子邮件地址 然后 他们将进入一个可以创建密码的页面 一旦用户提供
  • SELECT 在 PL/pgSQL 函数中引发异常

    我想在函数内实现循环 但收到此错误 ERROR 查询没有结果数据的目标 代码 CREATE OR REPLACE FUNCTION my function ill int ndx bigint RETURNS int AS DECLARE
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • Perl LWP GET 或 POST 到 SNI SSL URL

    我有一个使用 perl LWP 向客户发送数据的系统 他们可以选择 URL 以及是 POST 还是 GET 一位新客户最近抱怨该服务不起作用 他们怀疑这是因为他们的端点使用了 SNI SSL 查看日志 我看到的只是错误消息 证书验证失败 5
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • 如何确定层级组织中的权限?

    我正在尝试创建高性能逻辑来确定分层组织内的权限 员工被分配到一个或多个单位 单元是分层的 理论上 无限深度 实际上不超过 6 层 例如 员工Jane可能是Supervisor of the Accounts Receivable单元 的子单
  • PostgreSQL函数中sql语言和plpgsql语言的区别

    我很新数据库开发所以我对下面的例子有一些疑问 函数 f1 语言 SQL create or replace function f1 istr varchar returns text as select hello varchar istr
  • Rails 的多个数据库不适用于远程数据库

    我有一个远程只读 postgres 数据库 它是通过 docker 实例维护的卡尔达诺数据库同步 https github com input output hk cardano db sync 我设法将开发数据库连接到它 它工作正常 但由
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释

随机推荐