Unterstütze unsere Tutorials mit einem WerbeClick!

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;
                // ...
            )
        );
    }
 
Unterstütze unsere Tutorials mit einem Werbeclick!

Über uns

Wir sind ein agiles Team von Softwareentwicklungen, UX-Designern und IT-Supporten und haben uns auf individuelle Softwarelösung für den Mittelstand spezialisiert. Unsere besondere Stärken sind  Web-Anwendungen mit dem Symfony Framework sowie individuelle Industrielösungen für Produktionslinien, Servicetechniker oder Inspekteure zu entwickeln. 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!