Installation:
composer require ekreative/redmine_login
Register the Bundle in config/bundles.php (Symfony):
return [
// ...
Ekreative\RedmineLoginBundle\EkreativeRedmineLoginBundle::class => ['all' => true],
];
Configure Parameters in .env (Laravel/Symfony hybrid):
REDMINE_URL=http://your-redmine-instance.com
Add to config/services.php (Laravel):
'redmine' => [
'url' => env('REDMINE_URL'),
],
Publish Config (if needed):
php artisan vendor:publish --provider="Ekreative\RedmineLoginBundle\EkreativeRedmineLoginBundle"
First Use Case:
/login/redmine).routes/web.php (Laravel):
Route::get('/login/redmine', [RedmineAuthController::class, 'redirectToRedmine']);
Authentication Flow:
Ekreative\RedmineLoginBundle\Security\RedmineAuthenticationProvider.User model).User Provider Integration:
Illuminate\Contracts\Auth\Authenticatable or Symfony’s UserInterface to include Redmine-specific fields (e.g., redmine_id, redmine_login).use Ekreative\RedmineLoginBundle\Traits\RedmineUserTrait;
Role/Groups Sync:
roles table or Symfony’s ROLE_* roles.$redmineGroups = $redmineClient->getUserGroups($user->redmine_id);
$user->syncRoles(array_map(fn($g) => 'GROUP_'.$g['name'], $redmineGroups));
Session Handling:
protected function authenticate(Request $request, Response $response) {
if (!$request->user()->redmine_token) {
return redirect()->route('login.redmine');
}
return $response;
}
API Integration:
RedmineClient to fetch user/project data:
$client = new \Ekreative\RedmineLoginBundle\Client\RedmineClient(
config('redmine.url'),
$user->redmine_api_key
);
$projects = $client->getProjects();
Deprecated Symfony Bundle:
spatie/laravel-symfony-bundle or adapt the logic manually.RedmineAuthenticationProvider (for auth logic).RedmineUserProvider (for user resolution).Outdated Dependencies:
RedmineClient to handle changes:
class CustomRedmineClient extends \Ekreative\RedmineLoginBundle\Client\RedmineClient {
public function getUserGroups($userId) {
return $this->request('users/'.$userId.'/memberships');
}
}
Token Management:
if (!$user->redmine_token) {
$token = $this->generateRedmineToken($user->redmine_login);
$user->update(['redmine_token' => $token]);
}
CSRF and Security:
VerifyCsrfToken middleware or Symfony’s csrf_token validation.Performance:
Cache::remember("redmine_groups_{$user->redmine_id}", now()->addHours(1), function() use ($user) {
return $this->redmineClient->getUserGroups($user->redmine_id);
});
Custom User Mapping:
Ekreative\RedmineLoginBundle\Security\User\RedmineUser to map Redmine attributes to Laravel fields:
class LaravelRedmineUser extends RedmineUser {
public function getAuthIdentifierName() {
return 'redmine_id'; // Use Redmine's user ID as Laravel's ID
}
}
Debugging:
'redmine' => [
'url' => env('REDMINE_URL'),
'debug' => env('APP_DEBUG'), // Pass to client constructor
];
Testing:
RedmineClient in tests:
$mockClient = Mockery::mock(\Ekreative\RedmineLoginBundle\Client\RedmineClient::class);
$mockClient->shouldReceive('getUserInfo')->andReturn(['id' => 1, 'login' => 'test']);
$this->app->instance(\Ekreative\RedmineLoginBundle\Client\RedmineClient::class, $mockClient);
Fallback Auth:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'redmine' => [
'driver' => 'session',
'provider' => 'redmine',
],
],
Extension Points:
redmine.login.success to trigger post-auth actions:
event(new RedmineLoginEvent($user));
php artisan redmine:sync-users
How can I help you explore Laravel packages today?