idci / keycloak-security-bundle
借助 keycloak,让您轻松处理应用程序安全。
Requires
- knpuniversity/oauth2-client-bundle: ^2.0
- symfony/dependency-injection: ^5.3|^6.0
- symfony/framework-bundle: ^5.3|^6.0
- symfony/http-client: ^5.3|^6.0
- symfony/http-foundation: ^5.3|^6.0
- symfony/routing: ^5.3|^6.0
- symfony/security-bundle: ^5.3|^6.0
Requires (Dev)
- phpunit/phpunit: ^6.0
- symfony/expression-language: ^5.3|^6.0
- symfony/finder: ^5.3|^6.0
- symfony/form: ^5.3|^6.0
- symfony/stopwatch: ^5.3|^6.0
- symfony/twig-bundle: ^5.3|^6.0
- symfony/validator: ^5.3|^6.0
- symfony/yaml: ^5.3|^6.0
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>