| Current Path : /var/git/cesa-v3/docs/specs/ |
| Current File : /var/git/cesa-v3/docs/specs/echasl23-admin-login-design.md |
# ECHASL23 (PHPMaker) users — design **System:** cesa-v3 **Requirements:** [echasl23-admin-login-requirements.md](echasl23-admin-login-requirements.md) ## Data model | DB column | Entity property | Notes | |-----------|-----------------|-------| | `adminuserid` | `id` | PK | | `adminusername` | `username` | Unique login | | `adminpassword` | `password` | 32-char MD5 hex | | `email` | `email_address` | | | `level` | `access_level` | PHPMaker user level ID | | `activated` | `activated` | Must be true to log in | | `pwdchanged` | `pwdchanged` | Updated when password changes | | `profile` | `profile` | Serialized PHPMaker profile (not edited in Sonata) | Doctrine maps `App\UserBundle\Entity\UserOld` via annotation mapping under `src/UserBundle/Entity` (added to `doctrine.yaml`). ## Security ``` form_login → chain provider ├─ users (UserList / user_list) └─ echasl23_users (UserOld / echasl23, activated only) ``` - **Password hasher:** `Echasl23Md5PasswordHasher` registered for `UserOld` only; `UserList` keeps `auto`. - **Roles:** `Echasl23UserService::resolveRoles(UserOld)` — level < 0 → super-admin role set; otherwise base staff roles including `ROLE_ADMIN` and `ROLE_SONATA_ADMIN`. ## Services | Class | Responsibility | |-------|----------------| | `Echasl23UserService` | MD5 hash on save, `resolveRoles`, `applyPlainPassword`, `touchPasswordChanged` | | `Echasl23Md5PasswordHasher` | Symfony `PasswordHasherInterface` for login | | `Echasl23UserProvider` | Entity provider; rejects inactive users | ## Sonata - **Admin:** `UserOldAdmin` — model `UserOld`, CRUD via default Sonata controller. - **Hooks:** `prePersist` / `preUpdate` delegate to `Echasl23UserService` for password hashing. - **Form:** `plainPassword` (unmapped) on entity for create/edit only. ## Tests - `tests/Unit/UserBundle/Echasl23Md5PasswordHasherTest.php` - `tests/Unit/UserBundle/Echasl23UserServiceTest.php`