magoumi/idci-keycloak-security-bundle

借助keycloak,您可以轻松处理应用程序的安全问题。显然,我必须让它强制使用https(眨眼)。

安装: 5

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 0

分支: 45

类型:symfony-bundle

v1.0.1 2023-10-27 16:06 UTC

This package is auto-updated.

Last update: 2024-09-27 18:23:21 UTC


README

此Symfony包是FOSUserBundle的替代解决方案,与keycloak协同工作。

对于symfony 2/3/4使用版本1.2.0,对于symfony 5+使用版本2.0.0或更高版本。

安装

使用composer

$ composer require idci/keycloak-security-bundle

配置

如果您想在本地设置keycloak,您可以在此处下载它 这里 并按照官方文档中的说明进行操作。如果您想在使用docker时使用keycloak,请直接转到Docker配置

包配置

基本

如果您已经在您的机器上本地运行keycloak或远程运行但没有代理,这里是可以使用的默认配置。

# config/packages/idci_keycloak_security.yaml
idci_keycloak_security:
    server_url: '%env(resolve:KEYCLOAK_SERVER_BASE_URL)%'
    server_public_url: '%env(resolve:KEYCLOAK_SERVER_PUBLIC_BASE_URL)%'
    server_private_url: '%env(resolve:KEYCLOAK_SERVER_PRIVATE_BASE_URL)%'
    realm: '%env(resolve:KEYCLOAK_REALM)%'
    client_id: '%env(resolve:KEYCLOAK_CLIENT_ID)%'
    client_secret: '%env(resolve:KEYCLOAK_CLIENT_SECRET)%'
    default_target_route_name: 'app_home'
    ssl_verification: true

Docker

如果您想在docker中使用keycloak,您可以根据此示例构建您的栈。

以下是一个docker swarm的堆栈示例配置

# config/packages/idci_keycloak_security.yaml
idci_keycloak_security:
    server_public_url: 'http://keycloak.docker' # your keycloak url accessible via your navigator
    server_private_url: 'http://keycloak:8080' # your keycloak container reference in the network
    realm: 'MyRealm'
    client_id: 'my-client'
    client_secret: '21d4cc5c-9ed6-4bf8-8528-6d659b66f216'
    default_target_route_name: 'home' # The route you will be redirected to after sign in

请确保您的php容器连接到包含keycloak的网络,否则它将无法解析 "http://keycloak:8080/auth",并且public_server_url必须可以通过端口80访问,因为keycloak会验证发行者。

注意:keycloak的API端点已更改,因此如果您使用的是旧版本,请将/auth添加到您的URL中。

idci_keycloak_security:
    server_public_url: 'http://keycloak.docker/auth'
    server_private_url: 'http://keycloak:8080/auth'

路由配置

config/routes/中创建一个新文件,以加载预配置的包路由。

# config/routes/idci_keycloak_security.yaml
IDCIKeycloakSecurityBundle:
    resource: "@IDCIKeycloakSecurityBundle/Resources/config/routing.yaml"
    prefix: /

这将向您的应用程序添加以下路由

idci_keycloak_security_auth_connect       => /auth/connect/keycloak
idci_keycloak_security_auth_connect_check => /auth/connect-check/keycloak
idci_keycloak_security_auth_logout        => /auth/logout
idci_keycloak_security_auth_account       => /auth/account

Symfony安全配置

要将keycloak与symfony链接,您必须配置您的应用程序安全文件。

这里是一个简单的配置,它只允许具有“ROLE_USER”或“ROLE_ADMIN”角色的用户访问/*路由。

# config/packages/security.yaml
imports:
    # Import Keycloak security providers
    - { resource: '@IDCIKeycloakSecurityBundle/Resources/config/security.yaml' }

security:

    enable_authenticator_manager: true
    firewalls:

        # This route create the OAuth 2 "User Authorization Request" and must be accessible for unauthenticated users
        auth_connect:
            pattern: /auth/connect/keycloak
            security: false

        # Here is an example to protect your application (API) using OAuth 2 Client Credentials Flow (JWT with Bearer token authentication)
        api:
            pattern: ^/api
            provider: idci_keycloak_bearer_security_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\BearerAuthenticationEntryPoint
            custom_authenticators:
                - IDCI\Bundle\KeycloakSecurityBundle\Security\Authenticator\KeycloakBearerAuthenticator

        # Here is an example to protect your application (UI) using OAuth 2 Authorization Code Flow
        secured_area:
            pattern: ^/
            provider: idci_keycloak_security_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\AuthenticationEntryPoint
            custom_authenticators:
                - IDCI\Bundle\KeycloakSecurityBundle\Security\Authenticator\KeycloakAuthenticator
            logout:
                path: idci_keycloak_security_auth_logout

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER

    access_control:
        # This following ROLES must be configured in your Keycloak client
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/api, roles: ROLE_API }

注意:如果您想使用OAuth 2授权码流来保护以/admin开头的路由,您必须将提供的包路由放在防火墙后面,以下是如何做到这一点的示例

    ...

        secured_area:
            pattern: ^/(admin|auth)
            provider: idci_keycloak_security_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\AuthenticationEntryPoint
            custom_authenticators:
                - IDCI\Bundle\KeycloakSecurityBundle\Security\Authenticator\KeycloakAuthenticator
            logout:
                path: idci_keycloak_security_auth_logout

    ...

Keycloak配置

如果您在使用keycloak时需要帮助,因为我们第一次使用它,我们制作了一个逐步的小教程,描述了keycloak领域的基本配置。

注销

要注销用户,请使用路由'idci_keycloak_security_auth_logout'。

<a href="{{ url('idci_keycloak_security_auth_logout') }}">Logout</a>

Keycloak用户账户空间

如果您想提供访问keycloak用户账户空间的链接,请使用路由'idci_keycloak_security_auth_account'。

<a href="{{ url('idci_keycloak_security_auth_account') }}">Account</a>