Django でユーザー認証

Django でユーザー認証を行う方法です。

元のプロジェクトは、
[Django で テンプレートを使う](https://qiita.com/ekzemplaro/items/7a260142abe6042289b4)
に 次のようにして　MariaDB を使えるようにしたものです。
[Django で MariaDB を使う](https://qiita.com/ekzemplaro/items/b0140f16a780c689b890)

次のようにユーザーが出来ているものとします。
![user.png](https://qiita-image-store.s3.amazonaws.com/0/179446/501501c6-c27d-47b9-570f-7db79df75825.png)

まず、テンプレートに追加です。
次の３つのファイルを作成します。
>templates/registration/base.html
>templates/registration/login.html
>templates/registration/logged_out.html

フォルダーの作成

```bash
mkdir templates/registration
```

```html:templates/registration/base.html
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Django System</title>
</head>
<body>
<div class="container">
    <div class="content">
        {% block content %}{% endblock %}
    </div>
</div>
</body>
</html>
```

```html:templates/registration/login.html
{% extends 'registration/base.html' %}

{% block title %}Login{% endblock %}

{% block content %}
<h1>Login</h1>
<section class="common-form">
    {% if form.errors %}
    <p class="error-msg">Your username and password didn't match. Please try again.</p>
    {% endif %}

    {% if next %}
    {% if user.is_authenticated %}
    <p class="error-msg">Your account doesn't have access to this page. To proceed,
        please login with an account that has access.</p>
    {% else %}
    <p class="error-msg">Please login to see this page.</p>
    {% endif %}
    {% endif %}

    <form method="post" action="{% url 'login' %}">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="submit">Login</button>
        <input type="hidden" name="next" value="{{ next }}"/>
    </form>
</section>
{% endblock %}
```

```html:templates/registration/logged_out.html
{% extends 'registration/base.html' %}

{% block title %}Logout{% endblock %}

{% block content %}
<h1>Logged Out</h1>
<p>Thanks for spending some quality time with the Web site today.</p>
<p><a href="{% url 'login' %}">Log in again</a></p>
{% endblock %}
```

views.py を修正します。
>次を追加します。
>from django.contrib.auth.decorators import login_required
>@login_required

```py:home/views.py
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    str_out = ""
    str_out += "*** home *** start ***<p />"
    str_out += "ホームです。<p />"
    str_out += "<a href='app01/'>app01</a><p />"
    str_out += "<a href='app02/'>app02</a><p />"
    str_out += "*** Dec/10/2018 PM 16:58 ***<p />"
    str_out += "*** home *** end ***<p />"
    return HttpResponse(str_out)
```

 次も同様に修正します。
>app01/views.py
>app02/views.py

accounts というアプリを作成

```bash
python manage.py startapp accounts
```

proj01/urls.py を修正

```py:proj01/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
    path('', include('home.urls')),
    path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls')),
    path('admin/', admin.site.urls),
]
```

開発サーバーを起動してテスト

```bash
python manage.py runserver
```

http://127.0.0.1:8000/ にアクセス
![login.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e26a26a2-025f-ccbd-fdf1-2a722f131a3b.png)

Logout を実装するには、

```py:proc01/settings.py
（省略）
LOGIN_REDIRECT_URL = '/'
```

ページに　Logout のリンクを追加します。

```py:home/views.py
（省略）
    str_out += '<a href="accounts/logout/">Logout</a><p />'
（省略）
```

```html:templates/app01.html
（省略）
<a href="../accounts/logout/">Logout</a><p />
（省略）
```

```html:templates/app02.html
（省略）
<a href="../accounts/logout/">Logout</a><p />
（省略）
```

開発サーバーを起動してテスト

```bash
python manage.py runserver
```

![logout_01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/2f80cb66-86b2-b3bb-2b8c-9307eb6550e5.png)

![logout_02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/add7c04a-438d-4616-d8b5-2c419dd74b1c.png)