Borodin suggested创建视图并将其用作用户表。我已经做了一些测试,可以说这确实是实现这一点的最简单方法。
警告:由于视图的性质,这使得应用程序无法修改或添加用户!
请考虑以下Dancer2申请。我从dancer2
创建脚本开始。
$ dancer2 gen -a Foo
$ cd Foo
我创建了以下简单的sqlite数据库。
$ echo "
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(32) NOT NULL UNIQUE,
password VARCHAR(40) NOT NULL,
disabled TIMESTAMP NULL
);
CREATE VIEW active_users (id, username, password) AS
SELECT id, username, password FROM users WHERE disabled IS NULL;
INSERT INTO users (username, password, disabled)
VALUES ('foo', 'test', null),
('bar', 'test', '2017-10-01 10:10:10');
" | sqlite3 foo.sqlite
只有一个users
表由插件建议的默认列,加上列disabled
,其可以是或NULL
一个时间戳。我认为用禁用来说明比用有效更容易说明。我想对lib/Foo.pm
做以下修改。所有这些基本上来自Dancer2::Plugin::Auth::Extensible和Dancer2::Plugin::Auth::Extensible::Provider::Database的文档。
package Foo;
use Dancer2;
use Dancer2::Plugin::Database;
use Dancer2::Plugin::Auth::Extensible;
our $VERSION = '0.1';
get '/' => sub {
template 'index' => { 'title' => 'Foo' };
};
get '/users' => require_login sub {
my $user = logged_in_user;
return "Hi there, $user->{username}";
};
true;
接下来,插件需要进入配置。编辑config.yml
并用此替换它。
appname: "Foo"
layout: "main"
charset: "UTF-8"
template: "simple"
engines:
session:
Simple:
cookie_name: testapp.session
# this part is interesting
plugins:
Auth::Extensible:
realms:
users:
provider: 'Database'
############### here we set the view
users_table: 'active_users'
Database:
driver: 'SQLite'
database: 'foo.sqlite'
on_connect_do: ['PRAGMA foreign_keys = ON']
dbi_params:
PrintError: 0
RaiseError: 1
现在我们都准备尝试。
$ plackup bin/app.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
在您的浏览器上访问http://localhost:5000/users。你会看到默认的登录表单。
输入foo
和test
。这应该工作,你应该看到/users
路线。 (或者不是,就像我的情况那样,重定向似乎被打破了......)。
现在去http://localhost:5000/logout摆脱Foo的饼干和开放http://localhost:5000/users一次。这次输入bar
和test
。
你会看到登录不起作用。
要反测试,更换config.yml
的users_table
并重新启动应用程序。
# config.yml
users_table: 'users'
现在用户foo
将能够登录。因为数据库处理所有的逻辑(并且很可能已经缓存了它),所以这种方法不仅易于实现,而且也应该是具有最高性能的方式。
您的应用程序,特别是身份验证插件,也不需要了解活跃或禁用领域都存在。他们不需要关心。东西只会工作。
我不明白为什么有人会低估你的问题。它写得很好,显示了一些研究(我们认为阅读源不应该被期望,或根本没有问题),它清楚地说明你想要做什么以及为什么,并且有一个代码示例是这里没有关系。 – simbabque
我创建了一个票据将其移入文档:https://github.com/PerlDancer/Dancer2-Plugin-Auth-Extensible-Provider-Database/issues/5 – simbabque