LoginSignup
1
1

More than 1 year has passed since last update.

Symfony4 ユーザー認証機能作成(後編)

Posted at

こちらは前編の続きになります。
先に前編のほうを完了させてから進めてください。
Symfony4 ユーザー認証機能作成(前編)

ログインページを作成する

ログイン処理のSecurityControllerを作成する

$ php bin/console make:controller
src/Controller/SecurityController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
        $error = $authenticationUtils
            ->getLastAuthenticationError();

        if ($this->getUser() == null) {
            $user = 'not logined...';
        } else {
            $user = 'logined: ' . $this->getUser()->getUsername(); 
        }

        return $this->render('security/login.html.twig', [
            'error' => $error,
            'user' => $user,
        ]);
    }
}

ログイン用のテンプレートを作成する。

templates/security/login.html.twig
{% extends 'base.html.twig' %}

{% block title %}Hello SecurityController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">
    <p>login</p>
    <p>{{user}}</p>
    {% if error %}
    <p>{{ error.messageKey }}</p>
    {% endif %}

    <form action="{{ path('login') }}" method="post">
        <table>
            <tr>
                <th><label for="username">Username:</th>
                <td><input type="text" id="username" name="_username" /></td>
            </tr>
            <tr>
                <th><label for="password">Password:</th>
                <td><input type="password" id="password" name="_password" /></td>
            </tr>
            <tr><th></th><td><button type="submit">login</button></td></tr>
        </table>
    </form>
</div>
{% endblock %}

管理者ページを作成する

AdminControllerを作成する。

$ php bin/console make:controller
src/Controller/AdminController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class AdminController extends AbstractController
{
    /**
     * @Route("/admin", name="admin")
     */
    public function admin(): Response
    {
        return $this->render('admin/admin.html.twig', [
            'title' => 'Admin',
            'message' => 'message',
            'user' => $this->getUSer(),
        ]);
    }
}
templates/admin/admin.html.twig
{% extends 'base.html.twig' %}

{% block title %}Hello AdminController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">
    <h2>{{ message }}</h2>
    <p>user: {{ user.username }}</p>
    <p>mail: {{ user.email }}</p>
</div>
{% endblock %}

一般ユーザー用のページを作成する

HelloControllerを作成する。

$ php bin/console make:controller
src/Controller/HelloController.php
<?php

namespace App\Controller;

use App\Entity\Person;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class HelloController extends AbstractController
{
    /**
     * @Route("/hello", name="hello")
     */
    public function index(Request $request): Response
    {
        if (!$this->getUser()->getIsActivated()) {
            throw new AccessDeniedException('Unable to access!');
        }

        return $this->render('hello/index.html.twig', [
            'title' => 'Admin',
            'message' => 'message',
            'user' => $this->getUser(),
        ]);
    }
}
templates/hello/index.html.twig
{% extends 'base.html.twig' %}

{% block title %}Hello HelloController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">
    <h2>{{ message }}</h2>
    <table>
        <tr><th>id</th><td>{{ user.id }}</td></tr>
        <tr><th>name</th><td>{{ user.username }}</td></tr>
        <tr><th>mail</th><td>{{ user.email }}</td></tr>
    </table>
</div>
{% endblock %}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1