idci / keycloak-security-bundle

借助 keycloak,让您轻松处理应用程序安全。

v2.0.7 2024-07-04 13:20 UTC

README

这是一个基于 symfony 的 bundle,是 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 配置

Bundle 配置

基本

如果您已经在本地机器上运行 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/ 中创建一个新文件以加载预配置的 bundle 路由。

# 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 开头的路由,您必须在防火墙后面放置提供的 bundle 路由,以下是如何操作的示例

    ...

        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>