magoumi / idci-keycloak-security-bundle
借助keycloak,您可以轻松处理应用程序的安全问题。显然,我必须让它强制使用https(眨眼)。
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
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>