Symfony kurzus 2014/2015 I. félév
Security: authentication, authorization, user provider, role-ok, access control, FOS user bundle
Authen'ca'on • Ez
még csak azt dönti el, hogy a rendszer által azonosítóható-e a felhasználó • Feladata: meghatározni, hogy ki nézi az adott oldalt • az azonosítás több módszerrel is történhet •
• • •
HTTP alapú form alapú Facebook, Google, Twitter, stb. (OAuth 2.0)
Authoriza'on • Ellenőrzi,
hogy az azonosított felhasználó rendelkezik-e az útvonalhoz szükséges jogosultságokkal.
•
Szerepkör (ROLE) alapú minden felhasználó rendelkezik bizonyos szerepkörökkel • egy adott erőforráshoz (útvonal, objektum) való hozzáférés szerepkörhöz köthető • sima Stringként kezelhetők • hierarchikus felépítés •
Authoriza'on példa # app/config/security.yml security: # ... access_control: - { path: ^/admin, roles: ROLE_USER_IP, ip: 127.0.0.1 } - { path: ^/admin, roles: ROLE_USER_HOST, host: symfony\.com$ } - { path: ^/admin, roles: ROLE_USER_METHOD, methods: [POST, PUT] } - { path: ^/admin, roles: ROLE_USER }
Authoriza'on példa - { path: ^/admin, roles: ROLE_USER_IP, ip: 127.0.0.1 } - { path: ^/admin, roles: ROLE_USER_HOST, host: symfony\.com$ } - { path: ^/admin, roles: ROLE_USER_METHOD, methods: [POST, PUT] } - { path: ^/admin, roles: ROLE_USER }
URI
IP
HOST
METHOD
ROLE
/admin/user
127.0.0.1
example.com
GET
ROLE_USER_IP
/admin/user
127.0.0.1
symfony.com
GET
ROLE_USER_IP
/admin/user
168.0.0.1
symfony.com
GET
ROLE_USER_HOST
/admin/user
168.0.0.1
symfony.com
POST
ROLE_USER_HOST
/admin/user
168.0.0.1
example.com
POST
ROLE_USER_METHOD
/admin/user
168.0.0.1
example.com
GET
ROLE_USER
Authoriza'on controllerben public function helloAction($name) { $securityContext = $this->get('security.context'); if (false === $securityContext->isGranted('ROLE_ADMIN')) {
throw new AccessDeniedException(); } } /** * @Secure(roles="ROLE_ADMIN") */ public function helloAction($name) { // ... }
Authoriza'on objektumokra (ACL) • objektumokra
egyessével tudunk jogosultságot ellenőrizni • pl. saját Actor adatlap szerkesztése • adatbázis alapú ehhez szükséges táblák előkészítése: • php app/console init:acl •
Authoriza'on objektumokra (ACL) public function addActorAction(Actor $actor) { // retrieving the security identity of the currently logged-in user $securityContext = $this->get('security.context'); $user = $securityContext->getToken()->getUser(); $securityIdentity = UserSecurityIdentity::fromAccount($user); // creating the ACL $aclProvider = $this->get('security.acl.provider'); $objectIdentity = ObjectIdentity::fromDomainObject($actor); $acl = $aclProvider->createAcl($objectIdentity); // grant owner access $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
$aclProvider->updateAcl($acl); }
Authoriza'on objektumokra (ACL) public function editActorAction(Actor $actor) { $securityContext = $this->get('security.context'); if (false === $securityContext->isGranted('EDIT', $actor)) {
throw new AccessDeniedException(); } } /** * @SecureParam(name="actor", permissions="EDIT") */ public function editActorAction(Actor $actor) { //... }
Access Control kifejezések - { path: ^/foo, access: "hasRole(ROLE_FOO') and hasRole(ROLE_BAR')" } - { path: ^/foo, access: "isAnonymus()" } - { path: ^/foo, access: "isAuthenticated()" } /** * @Secure(roles="ROLE_FOO") * @SecureParam(name="actor", permissions="EDIT") * @PreAuthorize("isGranted('actor', 'EDIT')") * @PreAuthorize("hasRole('ROLE_FOO') and hasRole('B')") * @PreAuthorize("isAnonymus()") */ public function editActorAction(Actor $actor) { //... }
User Provider • a
felhasználókat szolgáltatja • jöhetnek sok helyről •
config fájl, adatbázis, Facebook api, stb.
• beépítve •
2 van
conflig fáj, adatbázis
providers: chain_provider: chain: providers: [in_memory, user_db] memory_provider: memory: users: ryan: { password: ryanpass, roles: 'ROLE_USER' } admin: { password: kitten, roles: 'ROLE_ADMIN' } database_provider: entity: { class: Acme\UserBundle\Entity\User, property: username }
FOSUserBundle •
https://github.com/FriendsOfSymfony/FOSUserBundle
• adatbázisbeli
tárolásban segít, jellemzők:
alapvető adatbázis séma • regisztráció háttérműködése, formja • email megerősítés • jelszó emlékeztető • unit tesztek •
• telepítésről •
leírás:
https://github.com/FriendsOfSymfony/ FOSUserBundle/blob/master/Resources/doc/ index.md
FOSUserBundle commandok • php
app/console fos:user:
create testuser
[email protected] password • deactivate testuser • activate testuser • promote testuser ROLE_ADMIN • demote testuser ROLE_ADMIN • change-password testuser newpassword •
FOSUserBundle UserManager $userManager = $container ->get('fos_user.user_manager'); $user = $userManager->createUser(); $user->setUsername('John'); $user->setEmail('
[email protected]'); $user->addRole("ROLE_ADMIN"); $userManager->updateUser($user); $user = $userManager->findUserByUsername('John'); $userManager->deleteUser($user);