Symfony 3.4 Tutorial :: Login

In 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

security controller login 1
 
 

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;
                // ...
            )
        );
    }
 

Über uns

Wir sind ein agiles Team von Programmierern und haben uns auf Erweiterungen (extensions) für eine Vielzahl von Systemen spezialisiert. Unsere besondere Stärke ist das entwickeln von Erweiterungen für Shop-Systeme basierend auf dem Magento Framework oder die Entwicklung an Web-Anwendungen mit dem Symfony Framework. Eine weitere Stärke ist die Erweiterung von Content Management Systemen wie beispielsweise Wordpress, Typo3, Drupal und Joomla. Das entwickeln von Apps für Android, Windows und Apple OS Systemen ist selbstverständlich!