(16) 981791110 contato@policast.studio

O que é autenticação SAML?

A autenticação SAML (Security Assertion Markup Language) é um padrão de protocolo de autenticação Web baseado em XML que permite que um usuário autentique em um site da Web usando credenciais em outro site. É amplamente utilizado por empresas e organizações que desejam permitir que seus usuários usem suas credenciais corporativas para acessar diferentes serviços e aplicativos na Web.

Como implementar autenticação SAML no Symfony?

O Symfony é um framework PHP que oferece suporte à autenticação SAML por meio de pacotes como o SimpleSAMLphp. Para implementar a autenticação SAML no Symfony, siga estes passos:

  1. Instale o pacote SimpleSAMLphp usando o composer:
  2. composer require simplesamlphp/simplesamlphp ^1.19

  3. Crie um arquivo “saml.php” na pasta “config/packages” do seu projeto Symfony e adicione o seguinte código:

  4. return [
    'strict' => true,
    'idp' => 'https://idp.example.com',
    'sp' => [
    'entityId' => 'https://your-app.example.com',
    'assertionConsumerService' => [
    'url' => 'https://your-app.example.com/saml/acs',
    'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
    ],
    'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified'
    ],
    'security' => [
    'authnRequestsSigned' => true,
    'signMetadata' => true,
    'wantAssertionsSigned' => true,
    'wantNameIdEncrypted' => false,
    ],
    'contactPerson' => [
    'technical' => [
    'givenName' => 'Technical Guy',
    'emailAddress' => 'technical@example.com'
    ],
    'support' => [
    'givenName' => 'Support Guy',
    'emailAddress' => 'support@example.com'
    ]
    ]
    ];

    Nesse arquivo, defina o endereço do provedor de identidade (IDP) e seu provedor de serviços (SP). Você também pode configurar outras opções de segurança, como autenticação de solicitações assinadas e nome de formato.

  5. Crie uma rota para lidar com a resposta da autenticação SAML:

  6. # config/routes.yaml
    app_saml_acs:
    path: /saml/acs
    methods: [POST]
    controller: AppControllerSamlController::acs

  7. Crie um controlador para lidar com a resposta da autenticação SAML:

  8. // src/Controller/SamlController.php

    use SymfonyBundleFrameworkBundleControllerAbstractController;
    use SymfonyComponentHttpFoundationResponse;
    use SymfonyComponentRoutingAnnotationRoute;
    use SimpleSAMLAuthSimple;

    class SamlController extends AbstractController
    {
    /**
    * @Route("/saml/acs", name="app_saml_acs", methods={"POST"})
    */
    public function acs()
    {
    if (!array_key_exists('SAMLResponse', $_POST)) {
    throw new Exception('SAMLResponse not found in POST data');
    }

    $auth = new Simple(saml_php());
    $auth->processResponse();
    $errors = $auth->getErrors();

    if (!empty($errors)) {
    throw new Exception('SAML response processing errors');
    }

    $attributes = $auth->getAttributes();
    // Do something with the attributes

    return new Response('Authenticated with SAML');
    }
    }

    Nesse controlador, verifique se a resposta SAML contém um SAMLResponse e processe a resposta usando a biblioteca SimpleSAMLphp. Obtenha os atributos do usuário usando a função “getAttributes()” e faça o que precisar com eles.

  9. Crie um link ou botão para iniciar a autenticação SAML:

  10. Login with SAML

  11. Crie uma rota para redirecionar para o provedor de identidade para iniciar a autenticação:

  12. # config/routes.yaml
    hsl_saml_login:
    path: /saml/login
    controller: AppControllerSamlController::login

  13. Crie um controlador para lidar com o redirecionamento para o provedor de identidade:

  14. // src/Controller/SamlController.php

    use SymfonyBundleFrameworkBundleControllerAbstractController;
    use SymfonyComponentHttpFoundationRedirectResponse;
    use SymfonyComponentRoutingAnnotationRoute;
    use SimpleSAMLAuthSimple;

    class SamlController extends AbstractController
    {
    /**
    * @Route("/saml/login", name="hsl_saml_login")
    */
    public function login()
    {
    $auth = new Simple(saml_php());
    $auth->requireAuth([
    'ReturnTo' => $this->generateUrl('app_saml_acs', [], true)
    ]);

    return new RedirectResponse('/');
    }
    }

    Nesse controlador, crie um objeto SimpleSAMLphp e chame a função “requireAuth()” para redirecionar o usuário para o provedor de identidade. Especifique a URL de retorno usando a função “generateUrl()”.

Como permitir que usuários se autentiquem com diferentes provedores SAML?

Para permitir que usuários se autentiquem com diferentes provedores SAML, você precisa criar uma configuração de autenticação SAML para cada provedor e permitir que o usuário selecione o provedor desejado.

Para fazer isso, você pode criar uma lista de provedores em seu site e permitir que o usuário selecione um provedor clicando em seu nome. Quando o usuário seleciona um provedor, sua configuração SAML é usada para autenticar o usuário.

Você também pode permitir que o usuário insira manualmente a URL do provedor de identidade desejado em um campo de entrada.

Para suportar vários provedores SAML em seu site, você precisa alterar sua configuração de autenticação SAML para permitir diferentes configurações para cada provedor SAML. Isso pode ser feito movendo a configuração SAML para um arquivo externo e carregando-o dinamicamente, com base no provedor SAML selecionado pelo usuário.