diff --git a/app/AppKernel.php b/app/AppKernel.php index 94ecc54..e4ef5e0 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -32,6 +32,7 @@ public function registerBundles() new SumoCoders\FrameworkCoreBundle\SumoCodersFrameworkCoreBundle(), new SumoCoders\FrameworkSearchBundle\SumoCodersFrameworkSearchBundle(), new SumoCoders\FrameworkMultiUserBundle\SumoCodersFrameworkMultiUserBundle(), + new SumoCoders\FrameworkUserBundle\SumoCodersFrameworkUserBundle(), ]; if ($this->getEnvironment() === 'prod') { diff --git a/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig b/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig new file mode 100644 index 0000000..ca01700 --- /dev/null +++ b/app/Resources/SumoCodersFrameworkMultiUserBundle/views/User/base.html.twig @@ -0,0 +1,15 @@ +{% extends '::base.html.twig' %} + +{% block header_title %} +

+ {{ app.request.get('_route')|trans|capitalize }} +

+{% endblock %} + +{% block main %} + {{ form_start(form) }} + {{ form_rest(form) }} + + {{ form_end(form) }} + +{% endblock %} diff --git a/app/config/config.yml b/app/config/config.yml index 67ebd6a..bc69ecc 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -4,9 +4,12 @@ imports: services: multi_user.user_repository.collection: - class: SumoCoders\FrameworkMultiUserBundle\User\UserRepositoryCollection + class: SumoCoders\FrameworkMultiUserBundle\User\BaseUserRepositoryCollection arguments: - - ["@multi_user.user.repository"] + - + - "@multi_user.base_user.repository" + - "@sumo_coders.user.repository.user" + - "@sumo_coders.user.repository.admin" sumocoders.user_provider: class: SumoCoders\FrameworkMultiUserBundle\Security\ObjectUserProvider diff --git a/app/config/routing.yml b/app/config/routing.yml index 03130af..afce642 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -14,3 +14,10 @@ sumo_coders_framework_multi_user: fos_js_routing: resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml" + +sumo_coders_framework_user_bundle_crud: + resource: "@SumoCodersFrameworkUserBundle/Resources/config/routing.yml" + +sumo_coders_framework_user_bundle: + resource: "@SumoCodersFrameworkUserBundle/Controller" + type: annotation diff --git a/app/config/security.yml b/app/config/security.yml index a23326c..f68e74d 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -1,6 +1,6 @@ security: encoders: - SumoCoders\FrameworkMultiUserBundle\Entity\User: sha512 + SumoCoders\FrameworkMultiUserBundle\Entity\BaseUser: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER @@ -14,7 +14,7 @@ security: main: provider: sumocoders.multi_user_provider logout: - path: /%locale%/logout + path: multi_user_logout target: / anonymous: ~ guard: @@ -30,4 +30,6 @@ security: - { path: ^/\w\w/reset-password, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/(_(profiler|wdt|tests)|css|js)/, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/\w\w/locale.json, role: IS_AUTHENTICATED_ANONYMOUSLY } + - { path: ^/\w\w/user/\d+/edit-user, role: ROLE_USER } + - { path: ^/\w\w/user, role: ROLE_ADMIN } - { path: ^/, role: ROLE_USER } diff --git a/app/migrations/Version20171012095221.php b/app/migrations/Version20171012095221.php new file mode 100644 index 0000000..4f9e683 --- /dev/null +++ b/app/migrations/Version20171012095221.php @@ -0,0 +1,44 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE BaseUser (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, salt VARCHAR(255) NOT NULL, displayName VARCHAR(255) NOT NULL, passwordResetToken VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, status VARCHAR(50) NOT NULL COMMENT \'(DC2Type:user_status)\', discr VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); + $this->addSql('DROP TABLE User'); + $this->addSql('CREATE TABLE User (id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); + $this->addSql('CREATE TABLE Admin (id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); + $this->addSql('ALTER TABLE User ADD CONSTRAINT FK_2DA17977BF396750 FOREIGN KEY (id) REFERENCES BaseUser (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE Admin ADD CONSTRAINT FK_49CF2272BF396750 FOREIGN KEY (id) REFERENCES BaseUser (id) ON DELETE CASCADE'); + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema) + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE User DROP FOREIGN KEY FK_A3368EB3BF396750'); + $this->addSql('ALTER TABLE Admin DROP FOREIGN KEY FK_49CF2272BF396750'); + $this->addSql('DROP TABLE User'); + $this->addSql('DROP TABLE Admin'); + $this->addSql('CREATE TABLE User (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, password VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, salt VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, displayName VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, passwordResetToken VARCHAR(255) DEFAULT NULL COLLATE utf8_unicode_ci, email VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, status VARCHAR(50) NOT NULL COLLATE utf8_unicode_ci COMMENT \'(DC2Type:user_status)\', discr VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); + $this->addSql('DROP TABLE BaseUser'); + } +} diff --git a/composer.json b/composer.json index 6559d66..ebb3d96 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "jms/di-extra-bundle": "^1.7", "sumocoders/framework-search-bundle": "^4.0.0", "sumocoders/framework-example-bundle": "^8.0.0", - "sumocoders/framework-multi-user-bundle": "^6.0.0", + "sumocoders/framework-multi-user-bundle": "^8.0.0", "simple-bus/symfony-bridge": "^4.1", "simple-bus/doctrine-orm-bridge": "^4.0", "gedmo/doctrine-extensions": "^2.4", diff --git a/composer.lock b/composer.lock index 720b7c6..2c43ad7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "4b04f0971d87c6729a61141af06d5c02", + "content-hash": "43901b7a94e7a01bf8822baa372fa677", "packages": [ { "name": "beberlei/assert", @@ -3059,17 +3059,17 @@ }, { "name": "sumocoders/framework-multi-user-bundle", - "version": "6.1.1", + "version": "8.0.1", "target-dir": "SumoCoders/FrameworkMultiUserBundle", "source": { "type": "git", "url": "https://github.com/sumocoders/FrameworkMultiUserBundle.git", - "reference": "f8ea80155f19ba11b34fa8d2b6f540459de05adc" + "reference": "1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sumocoders/FrameworkMultiUserBundle/zipball/f8ea80155f19ba11b34fa8d2b6f540459de05adc", - "reference": "f8ea80155f19ba11b34fa8d2b6f540459de05adc", + "url": "https://api.github.com/repos/sumocoders/FrameworkMultiUserBundle/zipball/1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231", + "reference": "1b8fdbbd60c54d82ea510b9c7cbb4ba2bd817231", "shasum": "" }, "require": { @@ -3124,7 +3124,7 @@ "SumoCoders", "framework" ], - "time": "2017-08-16T08:53:20+00:00" + "time": "2017-10-23T08:46:06+00:00" }, { "name": "sumocoders/framework-search-bundle", diff --git a/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig b/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig index ef25fba..04a9fa2 100644 --- a/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig +++ b/src/SumoCoders/FrameworkCoreBundle/Resources/views/base.html.twig @@ -81,8 +81,18 @@ {% endif %} diff --git a/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php b/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php new file mode 100644 index 0000000..79fb979 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Controller/EditController.php @@ -0,0 +1,77 @@ +authorizationChecker = $authorizationChecker; + $this->tokenStorage = $tokenStorage; + + parent::__construct( + $formFactory, + $router, + $flashBag, + $translator, + $form, + $handler, + $userRepository, + $redirectRoute + ); + } + + /** + * @Template("SumoCodersFrameworkMultiUserBundle:User:base.html.twig") + * + * @param Request $request + * @param int|null $id + * + * @return array + * + * @throws AccessDeniedHttpException if not allowed to edit user + */ + public function editAction(Request $request, ?int $id): array + { + if (!$this->authorizationChecker->isGranted('ROLE_ADMIN') + && $this->tokenStorage->getToken()->getUser()->getId() !== $id + ) { + throw new AccessDeniedHttpException('Access denied.'); + } + + return parent::baseAction($request, $id); + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php b/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php new file mode 100644 index 0000000..3b16d6c --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Controller/IndexController.php @@ -0,0 +1,34 @@ +userRepository = $userRepository; + } + + /** + * @Route("/user") + * @Security("has_role('ROLE_ADMIN')") + * @Template() + * + * @return array + */ + public function indexAction(): array + { + return ['users' => $this->userRepository->findBy([], ['username' => 'ASC'])]; + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php new file mode 100644 index 0000000..6b58771 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/AdminDataTransferObject.php @@ -0,0 +1,52 @@ +user) { + $this->user->change($this); + + return $this->user; + } + + return new Admin( + $this->plainPassword, + $this->displayName, + $this->email + ); + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php new file mode 100644 index 0000000..d9bb23c --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/DataTransferObject/UserDataTransferObject.php @@ -0,0 +1,52 @@ +user) { + $this->user->change($this); + + return $this->user; + } + + return new User( + $this->plainPassword, + $this->displayName, + $this->email + ); + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php b/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php new file mode 100644 index 0000000..dc8af19 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/DependencyInjection/SumoCodersFrameworkUserExtension.php @@ -0,0 +1,17 @@ +load('services.yml'); + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php b/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php new file mode 100644 index 0000000..ae52875 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Entity/Admin.php @@ -0,0 +1,17 @@ +getSecurityAuthorizationChecker()->isGranted('ROLE_ADMIN')) { + return; + } + + $menu = $event->getMenu(); + $menuItem = $event->getFactory()->createItem( + 'user.menu.index', + array( + 'route' => 'sumocoders_frameworkuser_index_index', + ) + ); + $menuItem->setExtra('orderNumber', 50); + + $menu->addChild($menuItem); + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php b/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php new file mode 100644 index 0000000..e35a946 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Form/AddAdminType.php @@ -0,0 +1,27 @@ +remove('userName'); + } + + public static function getDataTransferObjectClass(): string + { + return AdminDataTransferObject::class; + } + + public function getBlockPrefix(): string + { + return 'user'; + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php b/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php new file mode 100644 index 0000000..33d80a7 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Form/AddUserType.php @@ -0,0 +1,27 @@ +remove('userName'); + } + + public static function getDataTransferObjectClass(): string + { + return UserDataTransferObject::class; + } + + public function getBlockPrefix(): string + { + return 'user'; + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php b/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php new file mode 100644 index 0000000..884300f --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Form/EditAdminType.php @@ -0,0 +1,27 @@ +remove('userName'); + } + + public static function getDataTransferObjectClass(): string + { + return AdminDataTransferObject::class; + } + + public function getBlockPrefix(): string + { + return 'user'; + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php b/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php new file mode 100644 index 0000000..38ea9d9 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Form/EditUserType.php @@ -0,0 +1,27 @@ +remove('userName'); + } + + public static function getDataTransferObjectClass(): string + { + return UserDataTransferObject::class; + } + + public function getBlockPrefix(): string + { + return 'user'; + } +} diff --git a/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php b/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php new file mode 100644 index 0000000..20d425f --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/Repository/AdminRepository.php @@ -0,0 +1,19 @@ + + {{ 'user.header.index'|trans|capitalize }} + +{% endblock %} + +{% block header_navigation %} + + {{ icon('plus') }} + {{ 'user.actions.add.user'|trans|capitalize }} + + + {{ icon('plus') }} + {{ 'user.actions.add.admin'|trans|capitalize }} + +{% endblock %} + +{% block main %} + + + + + + + + + + + {% for user in users %} + + + + + + + {% endfor %} + +
{{ 'user.datagrid.email'|trans|capitalize }}{{ 'user.datagrid.type'|trans|capitalize }}
{{ user.email }} + {% if user is admin %} + {{ 'user.types.admin'|trans }} + {% else %} + {{ 'user.types.user'|trans }} + {% endif %} + + + + {{ 'datagrids.actions.edit'|trans }} + + + + + + {% if user.isBlocked() %} + {{ 'user.datagrid.actions.unblock'|trans }} + {% else %} + {{ 'user.datagrid.actions.block'|trans }} + {% endif %} + + +
+{% endblock %} diff --git a/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php b/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php new file mode 100644 index 0000000..d809431 --- /dev/null +++ b/src/SumoCoders/FrameworkUserBundle/SumoCodersFrameworkUserBundle.php @@ -0,0 +1,9 @@ +