Symfony 3.4 Tutorial :: Login
Write a commentIn diesem Tutorial wollen wir zeigen, wie man mit dem Symfony-Framework bestimmte Bereiche mit einem Login schützen kann. Dazu benötigt man Benutzer, Gruppen und Zugriffsrollen (ROLES), sowie ein Anmeldeformular das angezeigt wird, wenn ein Benutzer versucht einen URL aufzurufen die einen Login benötigt.
1. Login Controller
Für den Login muss man als erstes einen neuen Controller in Symfony anlegen.
Diesen nennen wir "Security".
# php bin/console generate:controller --controller=AppBundle:Security
2. Login Action anlegen
Als nächstes erstellen wir die loginAction für den Login.
Achtet darauf, dass ihr noch ein paar Klassen mit "use" laden müsst.
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class SecurityController extends Controller { const AUTHENTICATION_ERROR = \Symfony\Component\Security\Core\Security::AUTHENTICATION_ERROR; const LAST_USERNAME = \Symfony\Component\Security\Core\Security::LAST_USERNAME; /** * @Route("/login", name="login") * @param Request $request * @return Response */ public function loginAction(Request $request) { $session = $request->getSession(); // get the login error if there is one if ($request->attributes->has(self::AUTHENTICATION_ERROR)) { $error = $request->attributes->get( self::AUTHENTICATION_ERROR ); } else { $error = $session->get(self::AUTHENTICATION_ERROR); $session->remove(self::AUTHENTICATION_ERROR); } return $this->render('@App/Security/login.html.twig', array( // last username entered by the user 'last_username' => $session->get(self::LAST_USERNAME), 'error' => $error, // ... ) ); } }
3. Die View für den Login anlegen
Als nächstes legen wir für diese Action eine View an. Die Datei heisst analog "login.html.twig".
In dieser View erstellen wir dann die Login Form.
{# src/AppBundle/Resources/Views/Security/login.html.twig #} {% extends 'base.html.twig' %} {% block title%}AppBundle:Security:login{% endblock %} {% block body %} {% if error %} <div>{{ error.message }}</div> {% endif %} <div> <div> <form action="{{ path("login_check") }}" role="form" method="post"> <h2>Melde dich an</h2> <input type="text" id="username" name="_username" placeholder="User" value="{{ last_username }}" required autofocus> <input type="password" id="password" name="_password" placeholder="Password" required> <label> <input type="checkbox" value="remember-me"> Login merken </label> <button type="submit">Login</button> </form> </div> </div>
{% endblock %}
4. Routing für login_check und logout
Nun müsst ihr noch die Routings eintragen in der routing.yml Datei.
# app/config/routing.yml login_check: path: /secured_area/login_check logout: path: /secured_area/logout
Diese sind wichtig für den Login und Logout. Ersteres checkt ob ihr eingeloggt seid. Letzteres ist für den späteren Logout.
5. Sicherheitseinstellungen (Firewall & Co.)
Benutzer, Gruppen und Rollen sowie generelle Einstellungen zur Sicherheit werden im Symfony-Framework in einer sogenannten Firewall geregelt. Damit alles auch funktioniert müsst ihr ein paar Sachen in eure security.yml eintragen.
# app/config/security.yml security: encoders: Symfony\Component\Security\Core\User\User: plaintext role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] providers: in_memory: memory: users: user: { password: userpass, roles: [ 'ROLE_USER' ] } admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/demo/secured/login$ security: false secured_area: pattern: ^/ anonymous: ~ form_login: login_path: login check_path: login_check use_referer: true logout: path: /logout target: / access_control:
6. Benutzer anlegen
In der Datei security.yml legen wir den Benutzer "john" mit Adminberechtiung an.
# app/config/security.yml providers: in_memory: memory: users: user: { password: userpass, roles: [ 'ROLE_USER' ] } admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } john: { password: geheim, roles: [ 'ROLE_ADMIN' ] }
7. Action mit Login schützen
Nun könnt ihr eure Actions für bestimmte Zugriffsrollen regeln.
Das macht man, indem man der Action die @Security Annotation hinzufügt.
// src/bundlename/Controller/controllername.php use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
In dem nachfolgenden Beispiel schützen wir die Action "administration".
Durch die @Security Annotation stellen wir sicher, dass nur Mitglieder der Rolle "ROLE_ADMIN" hier zugriff haben werden!/** * @Route("/administration", name="administration") * @Security("is_granted('ROLE_ADMIN')") * @return Response */ public function administrationAction() { $user = $this->getUser(); return $this->render('@App/Security/administration.html.twig', array( 'error' => null; // ... ) ); }
You are a guest
or post as a guest
Loading comment...
The comment will be refreshed after 00:00.
Be the first to comment.