sgomez/ssp-guard-bundle

SimpleSAMLphp 对 Symfony 的集成

0.11.0 2019-04-25 20:58 UTC

This package is auto-updated.

Last update: 2024-08-26 08:39:27 UTC


README

此包可以帮助您使用 SimpleSAMLphp 安装与 Symfony 集成。此包使用 Guard 组件进行用户认证。

此包基于以下两个包

安装

步骤 1:下载包

通过运行以下命令使用 Composer 安装库

composer require sgomez/ssp-guard-bundle

步骤 2:启用包

接下来,在您的 app/AppKernel.php 文件中启用该包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Sgomez\Bundle\SSPGuardBundle\SSPGuardBundle(),
        // ...
    );
}

步骤 3:加载包的路由

通过在 app/config/routing.yml 文件的开始处添加此配置来加载包的路由

# app/config/routing.yml
ssp_bundle:
    resource: "@SSPGuardBundle/Resources/config/routing/connect.xml"
# ...

步骤 4:配置包

您需要在 app/config/config.yml 文件中配置 SimpleSAMLphp 安装的路径以及您想要使用的 authsources。以下是在 app/config/config.yml 文件中需要的示例配置

ssp_guard:
    installation_path: /var/simplesamlphp
    auth_sources:
        admin:
            title: Admin
            user_id: user
        symfony:
            title: My IDP
            user_id: uid

在这个例子中,adminsymfony 是在 SSP 的 authsources.php 中定义的名称。

步骤 5:创建 Guard 认证类

为了认证,您需要为每个使用的 authsource 创建一个 Guard 认证器。

存在一个 SSPGuardAuthenticator 基类,可以简化这个过程

<?php
// src/AppBundle/Security/AdminAuthenticator.php

namespace AppBundle\Security;

use Sgomez\Bundle\SSPGuardBundle\Security\Authenticator\SSPGuardAuthenticator;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserProviderInterface;

class AdminAuthenticator extends SSPGuardAuthenticator
{
    public function start(Request $request, AuthenticationException $authException = null)
    {
        // Change it to your login path 
        return new RedirectResponse($this->router->generate('login'));
    }
    
    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        return $userProvider->loadUserByUsername($credentials[$this->authsource->getUserId()][0]);
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        $this->saveAuthenticationErrorToSession($request, $exception);

        return new RedirectResponse($this->router->generate('login'));
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        $targetPath = $this->getTargetPath($request, $providerKey);

        if (!$targetPath) {
            // Change it to your default target
            $targetPath = $this->router->generate('homepage');
        }

        return new RedirectResponse($targetPath);
    }
}

并创建服务定义,例如。

<service id="app.admin.authenticator" class="AppBundle\Security\AdminAuthenticator">
    <argument type="service" id="router"/>
    <argument type="service" id="ssp.guard.registry"/>
    <argument>admin</argument> <!-- this is the authsource id -->
</service>

或者在 app/config/services.yml

AppBundle\Security\AdminAuthenticator:
    arguments: ["@router", "@ssp.guard.registry", "admin"] 

步骤 6:创建自定义用户提供者

如果您使用 FOSUserBundle,则可以使用它或创建自己的 自定义用户提供者

您的用户提供者将被传递到 SSPGuardAuthenticator::getUser 方法,并用于搜索用户。

步骤 7:配置安全设置

您需要配置 app/config/security.yml 以使用 Guard 认证器

# app/config/security.yml

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            guard:
                provider: fos_userbundle
                authenticators:
                    - app.admin.authenticator 
                    - ... # you can add as many authsources as you want

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/connect$, role: IS_AUTHENTICATED_ANONYMOUSLY }

步骤 8:路由

要初始化登录过程,您需要将链接放置到 ssp_guard_connect。有两个 Twig 函数可以帮助您完成此操作: ssp_auth_sourcesspp_auth_source。以下是一个登录模板的示例

{% for source in ssp_auth_sources() %}
    {% set item = ssp_auth_source(source) %}
    <a href="{{ path('ssp_guard_connect', {'authSource': source}) }}">
        {{ item.title }}
    </a>
{% endfor %}