digbang/security

Digbang中Laravel项目的安全包。


README

为新的laravel项目提供的安全包。

用法

SecurityServiceProvider 添加到你的 config/app.php 文件

'providers' => [
    Digbang\Security\Laravel\SecurityServiceProvider::class,
];

要使用此包,你需要定义一个需要保护的安全 上下文。此 上下文 内的URL将能够访问为他们配置的 SecurityApi。这样,你可以在单个应用程序上运行多个 上下文

在你的自定义 ServiceProvider :: boot() 中添加所需的上下文数量

<?php namespace App\Providers;

use Digbang\Security\SecurityContext;
use Digbang\Security\Configurations\SecurityContextConfiguration;

class MyServiceProvider extends \Illuminate\Support\ServiceProvider
{
    public function boot(SecurityContext $securityContext)
    {
        $configuration = new SecurityContextConfiguration('ecommerce');
        
        // customize the configuration object as needed...
        
        $securityContext->add($configuration);
    }
}

然后在你的路由中引用此上下文(作为 路由中间件

<?php
$router->group(['middleware' => 'security:ecommerce'], function(Router $router){
    
    // Controllers inside this routing group will be able to ask for an instance
    // of the Digbang\Security\Contracts\SecurityApi interface.
    
    $router->get('/', ['as' => 'foo', 'uses' => 'FooController@index']);
});

Digbang\Security\Contracts\SecurityApi 接口提供了对这个包所有功能的访问。在大多数情况下,它作为 Cartalyst\Sentinel\Sentinel 对象的包装器。

请参阅每个方法的文档以了解其用法。

用户

基本认证功能可以通过 SecurityApi 对象直接访问。

要访问 UserRepository 对象,调用 $securityApi->users()

提醒

提醒是与用户相关的随机生成代码,通常用于密码重置周期。

要访问提醒功能,使用 ReminderRepository,并通过 $securityApi->reminders() 调用。

持久性

持久性是通过生成会话和cookie令牌来保持登录会话的,这可以通过时间来持久化。

要访问持久性功能,使用 PersistenceRepository,并通过 $securityApi->persistences() 调用。

检查点

检查点是每次登录尝试时执行的自定义逻辑。Security包提供了 两个 检查点: ActivationsThrottles

激活

激活检查点会在用户每次登录时检查用户是否已激活其账户。如果检查失败,将抛出 NotActivatedException

要访问激活功能,使用 ActivationRepository,并通过 $securityApi->activations() 调用。

限速

限速检查点监控失败的登录尝试,以防止DDoS攻击。它记录三种不同类型的尝试,并对每种尝试做出不同的反应

  • 全局尝试:在配置的上下文内部的所有登录尝试都会记录一个全局尝试。
  • IP尝试:来自同一IP的尝试将被记录以识别可能的攻击者。
  • 用户尝试:对同一用户账户的多次失败登录尝试将被记录以识别可能的受害者。

每种尝试类型都有两种配置

  • 阈值 (intarray):表示在系统被阻止之前所需的尝试次数。可以使用 qty_attempts => block_time 的数组来根据失败尝试的数量阻止访问指定时间。
  • 间隔 (int):表示系统将阻止此类型进一步尝试的时间(以秒为单位)。

您可以通过 SecurityContextConfiguration 对象更改此配置。默认值如下

'global' => [
    'interval' => 900,
    'thresholds' => [
        10 => 1,
        20 => 2,
        30 => 4,
        40 => 8,
        50 => 16,
        60 => 12
    ]
],
'ip' => [
    'interval' => 900,
    'thresholds' => 5
],
'user' => [
    'interval' => 900,
    'thresholds' => 5
]

要访问限速功能,使用 ThrottleRepository,并通过 $securityApi->throttles() 调用。

角色

角色将用户分组,并允许管理员向一组用户授予(或拒绝)对资源的访问。

如果不需要,可以通过 SecurityContextConfiguration 对象禁用角色。

要访问角色功能,使用 RoleRepository,并通过 $securityApi->roles() 调用。

权限

权限是功能标识符,用于授予或拒绝特定用户或角色对系统部分访问权限。

默认情况下,RoutePermissionRepository对象将通过解析路由中的action数组来检查可用权限,寻找permission键。可以通过实现不同的Digbang\Security\Permissions\PermissionRepository并相应地更改SecurityContextConfiguration来更改此策略。

如果不需要,也可以通过SecurityContextConfiguration对象禁用权限。

要访问权限功能,请使用PermissionRepository并调用$securityApi->permissions()

生成URL

PermissibleUrlGenerator是Laravel的UrlGenerator接口的扩展。默认实现PermissionAwareUrlGenerator将检查当前登录用户是否有权访问请求的URL,如果没有权限,将抛出Digbang\Security\Permissions\PermissionException异常。

您可以通过$securityApi->url()方法访问此功能。

自定义对象

安全包通过更多功能扩展了Cartalyst\Sentinel接口。默认情况下,每个接口的实现(例如:Digbang\Security\Users\User)可以在相同的命名空间中找到(例如:Digbang\Security\Users\DefaultUser)。

如果您希望使用任何Entity的自定义实现,请按照以下步骤操作

  • 您必须要么
    • 通过扩展自己的实现来扩展存储库实现(例如:Digbang\Security\Users\DoctrineUserRepository
    • 或者您可以决定自行实现存储库接口(例如:Digbang\Security\Users\UserRepository
  • 您必须实现对应接口中的所有方法(例如:Digbang\Security\Users\User
  • 您必须在SecurityContextConfiguration对象中配置此内容,如上所示
  • 您可以使用实体特性(例如:Digbang\Security\Users\UserTrait
  • 您可以使用映射特性(例如:Digbang\Security\Users\UserMappingTrait