samsonasik/mezzio-authentication-with-authorization

Laminas 框架骨架示例,包括身份验证和授权功能,包含 csrf、flash、prg


README

ci build pgsql ci build mysql Code Coverage Downloads

简介

一个带有身份验证和授权示例的 Mezzio 3 骨架应用程序。

特性

  • 使用 csrf 加密的身份验证
  • 使用 prg 提高可用性的身份验证
  • 带有“记住我”功能的身份验证
  • 使用会话闪存的身份验证通知
  • 使用 ACL 进行授权
  • 布局中的 isGranted 检查
  • 布局中的 getRole 检查

安装

$ composer create-project samsonasik/mezzio-authentication-with-authorization -sdev
$ cd mezzio-authentication-with-authorization
$ cp config/autoload/local.php.dist config/autoload/local.php

配置

使用带有用户名和密码字段的本地数据库配置配置您的 config/autoload/local.php。提供了 dsn 的示例,适用于 PostgreSQLMySQL,您可以修改它们。

对于 PostgreSQL

以下命令是使用 PostgreSQL 的示例(假设使用用户 "postgres" 并创建名为 "mezzio" 的数据库),您可以创建用户表,并将用户名和 bcrypt 加密密码(使用 pgcrypto 扩展)插入用户表

$ createdb -Upostgres mezzio
Password:

$ psql -Upostgres mezzio
Password for user postgres:

psql (12.1)
Type "help" for help.

mezzio=# CREATE TABLE users(username character varying(255) PRIMARY KEY NOT NULL, password text NOT NULL, role character varying(255) NOT NULL DEFAULT 'user');
CREATE TABLE

mezzio=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION

mezzio=# INSERT INTO users(username, password, role) VALUES('samsonasik', crypt('123456', gen_salt('bf')), 'user');
INSERT 0 1

mezzio=# INSERT INTO users(username, password, role) VALUES('admin', crypt('123456', gen_salt('bf')), 'admin');
INSERT 0 1

并将获得以下数据

user data

对于 MySQL

以下命令是使用 MySQL 的示例(假设使用用户 "root" 并创建名为 "mezzio" 的数据库),您可以创建用户表,并插入用户名和 bcrypt 加密密码

$ mysql -u root -p -e 'create database mezzio'
Enter password:

$ mysql -u root
Enter password:

mysql> use mezzio
Database changed

mysql> CREATE TABLE users(username varchar(255) PRIMARY KEY NOT NULL, password text NOT NULL, role varchar(255) NOT NULL DEFAULT 'user');
Query OK, 0 rows affected (0.01 sec)

mezzio=# INSERT INTO users(username, password, role) VALUES('samsonasik','$2a$06$Nt2zePoCfApfBGrfZbHZIudIwZpCNqorTjbKNZtPoLCVic8goZDsi', 'user');
Query OK, 1 row affected (0.01 sec)

mezzio=# INSERT INTO users(username, password, role) VALUES('admin', '$2a$06$Y2TtankzyiK/OF1yZA4GsOJBhuoP7o99XbfufEeJ0OOJwjUcPB9LO', 'admin');
Query OK, 1 row affected (0.01 sec)

并将获得以下数据

user data

授权配置

授权配置以 ACL 的形式保存在 config/autoload/global.php

<?php

// config/autoload/global.php

declare(strict_types=1);

return [
    // ...
    'mezzio-authorization-acl' => [
        'roles'     => [
            'guest' => [],
            'user'  => ['guest'],
            'admin' => ['user'],
        ],
        'resources' => [
            'api.ping.view',
            'home.view',
            'admin.view',
            'login.form',
            'logout.access',
        ],
        'allow'     => [
            'guest' => [
                'login.form',
                'api.ping.view',
            ],
            'user'  => [
                'logout.access',
                'home.view',
            ],
            'admin' => [
                'admin.view',
            ],
        ],
    ],
    // ...
];

运行

  1. 清除浏览器缓存
  2. 运行 php -S 命令
$ php -S localhost:8080 -t public
  1. 打开浏览器: http://localhost:8080

  2. 使用用户名 : samsonasik,密码: 123456 或用户名 : admin,密码 : 123456 登录。如果您是以“user”角色登录的用户,并打开 /admin 页面,它将显示如下(403 禁止访问),例如:在 Firefox 开发者工具 下的“网络”监视器中查看

authorized-user-cannot-access-admin-page

测试

测试位于 test 目录下,您可以使用 composer 命令运行测试

$ composer test