22 Commits

Author SHA1 Message Date
Richard Toth
ae1a996ace update composer.json (guzzle update) 2025-12-19 13:40:59 +01:00
El. Abdellah
43399b443e Update README.md 2023-02-20 14:28:39 +01:00
El. Abdellah
727ade1a19 Merge pull request #11 from tricsusz/master
remove deprecated Serializable interface
2023-02-20 14:23:42 +01:00
88ec7d7bb1 remove deprecated Serializable interface 2023-02-20 14:04:43 +01:00
El. Abdellah
8c8ceb1279 Update README.md 2022-04-21 02:34:37 +02:00
El. Abdellah
f11d97ced0 Merge pull request #8 from tricsusz/master
remove /auth from Keycloak URL
2022-04-21 02:14:14 +02:00
fc2d81b9ad remove /auth from Keycloak URL 2022-04-19 19:11:39 +02:00
El. Abdellah
87909a1c15 Update README.md 2022-03-06 19:36:11 +01:00
El. Abdellah
f254ab52ac Merge pull request #6 from el-abdel/develop
Add compatibility with Symfony V6
2022-03-06 19:34:25 +01:00
el-abdel
570008ab6e fix compatibility 2022-03-06 18:49:47 +01:00
abdel
1f88ce8cb0 add compatibility with sf6 2022-03-06 18:28:33 +01:00
El. Abdellah
f2e6a6b4cb Update README.md 2022-03-06 18:07:16 +01:00
El. Abdellah
eec425222b Update ABELkeycloakBearerOnlyAdapterBundle.php 2022-03-06 17:17:43 +01:00
El. Abdellah
30bcc70c4f Merge pull request #5 from el-abdel/fix/deprecation
fix deprecated response
2022-03-06 15:26:32 +01:00
El. Abdellah
e719e3c6ff fix support method check 2022-03-01 17:39:54 +01:00
El. Abdellah
20015218a0 fix deprecated response 2022-02-28 14:06:43 +01:00
El. Abdellah
23de5882b0 Update README.md 2022-02-25 09:37:02 +01:00
El. Abdellah
56fba70416 Update README.md 2022-02-24 17:51:04 +01:00
El. Abdellah
f3d64ef323 Update README.md 2022-02-24 17:47:40 +01:00
El. Abdellah
ea95d68fb0 edit readme file 2022-01-03 11:03:16 +01:00
El. Abdellah
d1494427f2 Update README.md 2021-12-17 09:42:48 +01:00
El. Abdellah
c05aae70da Update README.md 2021-12-17 09:41:34 +01:00
7 changed files with 50 additions and 25 deletions

View File

@@ -5,11 +5,15 @@ namespace ABEL\Bundle\keycloakBearerOnlyAdapterBundle;
use ABEL\Bundle\keycloakBearerOnlyAdapterBundle\DependencyInjection\ABELkeycloakBearerOnlyAdapterExtension; use ABEL\Bundle\keycloakBearerOnlyAdapterBundle\DependencyInjection\ABELkeycloakBearerOnlyAdapterExtension;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\HttpKernel\Bundle\Bundle;
class ABELkeycloakBearerOnlyAdapterBundle extends Bundle class ABELkeycloakBearerOnlyAdapterBundle extends Bundle
{ {
public function getContainerExtension() /**
* @return ExtensionInterface|null
*/
public function getContainerExtension(): ?ExtensionInterface
{ {
if (null === $this->extension) { if (null === $this->extension) {
$this->extension = new ABELkeycloakBearerOnlyAdapterExtension(); $this->extension = new ABELkeycloakBearerOnlyAdapterExtension();

View File

@@ -27,7 +27,7 @@ class ABELkeycloakBearerOnlyAdapterExtension extends Extension
$definition->replaceArgument(4, $config['ssl_verification']); $definition->replaceArgument(4, $config['ssl_verification']);
} }
public function getAlias() public function getAlias(): string
{ {
return 'abel_keycloak_bearer_only_adapter'; return 'abel_keycloak_bearer_only_adapter';
} }

View File

@@ -5,10 +5,15 @@ This Symfony bundle is an adapter that allows securing API using keycloak Bearer
## Installation ## Installation
> Befor installing the bundle, automatic packages configuration can be activated with the following command:
> ```
> composer config extra.symfony.allow-contrib true
> ```
With composer: With composer:
``` ```
$ composer require abel/keycloak-bearer-only-adapter-bundle composer require abel/keycloak-bearer-only-adapter-bundle
``` ```
## Configuration ## Configuration
@@ -17,6 +22,15 @@ If you want to set up keycloak locally you can download it [here](https://www.ke
### Bundle configuration ### Bundle configuration
#### Via a recipe (Automatic)
This bundle hase a Symfony recipe that allow the automation of configuration via the Symfony Flex Composer plugin.
To enable recipe for your project, run the following command:
```
composer config extra.symfony.allow-contrib true
```
#### Manual
Having a running keycloak locally or in Docker and already configured a client with **Access Type = bearer-only** Having a running keycloak locally or in Docker and already configured a client with **Access Type = bearer-only**
here is the configuration to use: here is the configuration to use:
@@ -35,20 +49,25 @@ The best practice is to load your configuration from **.env** file.
# .env # .env
... ...
###> Abel_keycloak_bearer_only_adapter ### ###> Abel_keycloak_bearer_only_adapter ###
OAUTH_KEYCLOAK_ISSUER=http://keycloak.local:8080 OAUTH_KEYCLOAK_ISSUER=keycloak:8080
OAUTH_KEYCLOAK_REALM=my_realm OAUTH_KEYCLOAK_REALM=my_realm
OAUTH_KEYCLOAK_CLIENT_ID=my_bearer_client OAUTH_KEYCLOAK_CLIENT_ID=my_bearer_client
OAUTH_KEYCLOAK_CLIENT_SECRET=my_bearer_client_secret OAUTH_KEYCLOAK_CLIENT_SECRET=my_bearer_client_secret
###< Abel_keycloak_bearer_only_adapter ### ###< Abel_keycloak_bearer_only_adapter ###
... ...
``` ```
> Since Keycloak 17 the default distribution is now powered by **Quarkus**, while the legacy **WildFly** powered distribution will still be around until June 2022 <br>
> The new distribution introduces a number of breaking changes, including: <br>
> - `/auth` removed from the default context path <br>
> ⚠️ **If you are using a legacy version make sure to include /auth in OAUTH_KEYCLOAK_ISSUER** <br>
> Example: `keycloak:8080/auth`
In case of using Keycloak with Docker locally replace **issuer** value with your keycloak container reference in the network In case of using Keycloak with Docker locally replace **issuer** value with your keycloak container reference in the network
For example, you can use the container IPAdresse, that you can get using this command: For example, you can use the service name, or container IPAdresse that you can get using this command:
``` ```
$ docker inspect <container id> | grep "IPAddress" docker inspect <container id> | grep "IPAddress"
``` ```
### Symfony security configuration ### Symfony security configuration
@@ -76,6 +95,7 @@ security:
access_control: access_control:
- { path: ^/api/, roles: ROLE_API } - { path: ^/api/, roles: ROLE_API }
``` ```
> :information_source: Referring to Symfony [documentation](https://symfony.com/doc/5.3/security.html#roles), roles must start with **ROLE_** (otherwise, things won't work as expected)
### Keycloak configuration ### Keycloak configuration
To configure keycloak to work with this bundle, [here](./Resources/docs/keycloak-config-guide.md) is a step by step documentation for a basic configuration of keycloak. To configure keycloak to work with this bundle, [here](./Resources/docs/keycloak-config-guide.md) is a step by step documentation for a basic configuration of keycloak.
@@ -86,5 +106,6 @@ To configure keycloak to work with this bundle, [here](./Resources/docs/keycloak
| Bundle Version | Symfony Version | | Bundle Version | Symfony Version |
| ------------------------------------------------------|--------------------| | ------------------------------------------------------|--------------------|
| V1.0.1 | >=4.0.0 <5.0.0 | | V1.0.1 | >=4.0.0 <5.0.0 |
| V1.1.0 (uses old authentication systeme with guard) | >=5.0.0 <6.0.0 | | V1.1.* (uses old authentication systeme with guard) | >=5.0.0 <6.0.0 |
| V1.2.0 (uses new authentication systeme) | >=5.3.0 <6.0.0 | | V1.2.* (uses new authentication systeme) | >=5.3.0 <6.0.0 |
| V1.3.* | >=6.0.0 <7.0.0 |

View File

@@ -11,7 +11,7 @@ use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException; use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator; use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface; use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
class KeycloakBearerAuthenticator extends AbstractAuthenticator class KeycloakBearerAuthenticator extends AbstractAuthenticator
@@ -31,7 +31,7 @@ class KeycloakBearerAuthenticator extends AbstractAuthenticator
return true; return true;
} }
public function authenticate(Request $request): PassportInterface public function authenticate(Request $request): Passport
{ {
$token = $request->headers->get('Authorization'); $token = $request->headers->get('Authorization');
if (null === $token || empty($token)) { if (null === $token || empty($token)) {

View File

@@ -6,7 +6,7 @@ namespace ABEL\Bundle\keycloakBearerOnlyAdapterBundle\Security\User;
use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserInterface;
class KeycloakBearerUser implements UserInterface, \Serializable class KeycloakBearerUser implements UserInterface
{ {
/** /**
* @var string * @var string
@@ -202,7 +202,7 @@ class KeycloakBearerUser implements UserInterface, \Serializable
* *
* @return array (Role|string)[] The user roles * @return array (Role|string)[] The user roles
*/ */
public function getRoles() public function getRoles(): array
{ {
return $this->roles; return $this->roles;
} }
@@ -270,7 +270,7 @@ class KeycloakBearerUser implements UserInterface, \Serializable
* @return string the string representation of the object or null * @return string the string representation of the object or null
* @since 5.1.0 * @since 5.1.0
*/ */
public function serialize() public function __serialize()
{ {
return serialize(array( return serialize(array(
$this->sub, $this->sub,
@@ -293,7 +293,7 @@ class KeycloakBearerUser implements UserInterface, \Serializable
* @return void * @return void
* @since 5.1.0 * @since 5.1.0
*/ */
public function unserialize($serialized) public function __unserialize($serialized)
{ {
list ( list (
$this->sub, $this->sub,

View File

@@ -85,7 +85,7 @@ class KeycloakBearerUserProvider implements UserProviderInterface{
*/ */
public function supportsClass(string $class) public function supportsClass(string $class)
{ {
return KeycloakBearerUser::class === $class || is_subclass_of(KeycloakBearerUser, User::class); return KeycloakBearerUser::class === $class || is_subclass_of($class, KeycloakBearerUser::class);
} }
@@ -100,7 +100,7 @@ class KeycloakBearerUserProvider implements UserProviderInterface{
'base_uri' => $this->issuer, 'base_uri' => $this->issuer,
]); ]);
$response = $client->post('/auth/realms/'.$this->realm.'/protocol/openid-connect/token/introspect', [ $response = $client->post('/realms/'.$this->realm.'/protocol/openid-connect/token/introspect', [
'auth' => [$this->client_id, $this->client_secret], 'auth' => [$this->client_id, $this->client_secret],
'form_params' => [ 'form_params' => [
'token' => $accessToken, 'token' => $accessToken,

View File

@@ -1,22 +1,22 @@
{ {
"name": "abel/keycloak-bearer-only-adapter-bundle", "name": "tothbt/keycloak-adapter-bundle",
"description": "Keycloak security adapter for bearer only clients", "description": "Keycloak security adapter for bearer only clients",
"license": "MIT", "license": "MIT",
"type": "symfony-bundle", "type": "symfony-bundle",
"authors": [ "authors": [
{ {
"name": "Abdellah Elmakhroubi", "name": "Richard Toth",
"email": "abdellah.elmakhroubi@gmail.com" "email": "info@totbt.com"
} }
], ],
"minimum-stability": "stable", "minimum-stability": "stable",
"require": { "require": {
"php": ">=7.2.5", "php": ">=8.3",
"symfony/config": "^5.3", "symfony/config": "^6.0",
"symfony/dependency-injection": "^5.3", "symfony/dependency-injection": "^6.0",
"symfony/http-kernel": "^5.3", "symfony/http-kernel": "^6.0",
"symfony/security-bundle": "^5.3", "symfony/security-bundle": "^6.0",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^7",
"ext-json": "*" "ext-json": "*"
}, },
"autoload": { "autoload": {