Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用Dancer和Postgres的简单登录/授权系统_Perl_Postgresql_Dancer - Fatal编程技术网

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

Perl 使用Dancer和Postgres的简单登录/授权系统,perl,postgresql,dancer,Perl,Postgresql,Dancer,作为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

作为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 '/';
};
如何开始链接数据库,然后将用户输入的内容与数据库中的内容进行匹配?我什么时候实现密码的散列呢?任何教程都将不胜感激-我一直在使用Metapan,但它没有提供我需要的详细信息

最简单的方法:

下面是一篇关于如何正确操作的好文章:

问候,, Andras为您处理了大量样板代码。您可以启动并运行一个简单的登录系统,而无需编写任何自己的
/login
路由,如下所示

配置
Dancer::Plugin::Auth::Extensible
安装并将其添加到
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,您应该使用一个文件来存储连接凭据。确保该文件不是世界可读的。有关示例,请参见。测试您的凭据文件是否在命令行上工作,以及您的Web服务器是否可以读取它

您现有的表似乎与文档中的一致,但即使不一致,也可以在中调整表和列名

封锁你的路线 将
require\u login
关键字添加到要保护的路由。
/login
路由将使用基本登录表单自动生成,但如果您愿意,也可以

lib/MyApp.pm

package MyApp;
use Dancer ':syntax';

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

our $VERSION = '0.1';

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

true;
(是的,这就是你需要编写的全部代码。我告诉过你,它需要处理很多样板文件。)

用于自动散列密码。注意不要在数据库中存储明文密码;将用户添加到数据库时,应生成密码哈希并存储该哈希


请注意,在此示例中禁用了角色。如果启用角色,则只能允许具有管理员角色的用户查看管理员页面。

您看过舞者降临节日历中的这些文章吗?而且(后者是关于,它带走了很多样板文件)。@ThisSuitesBlack不是我有,我正试图使用第二个,但对如何实现它感到困惑。我下载了目录,被所有的文件压得喘不过气来,不知道我需要什么样的部分!你下载了什么目录?@ThisSuitesBlack不是他们的例子:我还是不知道你在说什么。如果你的意思是你下载了
Dancer::Plugin::Auth::Extensible::Provider::Example
,这是一个如何编写你自己的Auth插件的示例,你不需要这样做,因为它已经存在了。显然我不明白代码怎么会这么简单-非常感谢@不用谢。文档中有很多信息需要消化,特别是如果您是Perl和Dancer新手的话。
package MyApp;
use Dancer ':syntax';

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

our $VERSION = '0.1';

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

true;