admin Đăng lúc 2024-9-6 19:24:31

Hướng dẫn tạo hàm check người dùng đăng nhập

Thời gian vừa qua, mình thấy còn khá nhiều bạn còn đang lúng túng về cách sử dụng SMM để tạo lập một mô hình trang web đơn giản, đặc biệt là về khoản viết chức năng đăng nhập - đăng ký. Bài viết này mình sẽ hướng dẫn cho các bạn về cách viết và sử dụng chúng ha. Chúng ta cùng bắt đầu nầo! Hey zoooo

1. Trước tiên, tụi mình cần thiết lập một bảng dữ liệu để lưu trữ danh sách thành viên, để làm được điều này, ta sử dụng hàm create_table_with_column. Ở đây, tụi mình chỉ cần một số trường đơn giản, như:
- user -> tên tài khoản
- pass -> mật khẩu
- token -> chuỗi ký tự check với session hoặc cookie
- reg -> thời điểm đăng ký

Ta có thể tạo bảng với mục quản trị cơ sở dữ liệu trong bảng điều khiển hoặc thực hiện với lệnh sau:
{% do create_table_with_column('users', {"user":"TEXT""pass":"TEXT","token":"TEXT","reg":"INTEGER"}) %}

2. Tiếp theo là viết chức năng đăng ký, ta sẽ sử dụng các hàm sau:
- insert_rows_table -> để nhập dữ liệu mới vào bảng `users` đã tạo
- select_table_row_data_by_where -> để check xem user có tồn tại trong bảng hay không.
- Sử dụng toản tử match Regex để ràng buộc các ký tự có thể được chứa ở phần tử user trong mảng POST.

Có thể tham khảo code sau:

{% if SERVER_REQUEST_METHOD|lower == 'post' %}
{# === DUYỆT ĐẦU VÀO === #}
{% set user, pass, repass = form_post('user')|lower, form_post('pass'), form_post('repass') %}
{% set save_pass = md5(user~md5(pass)) %}
{% set save_token = md5(user~'.'~pass) %}
{% set user_data = select_table_row_data_by_where('users', {'user':user}) %}

{# === KIỂM TRA === #}
{% if user and pass and repass %}
{% if user_data['user'] == user or get_session('timereg') > 'now'|date('U') %}
    {% set notice = 'tên tài khoản đã tồn tại' %}
    {% set color = 'red' %}
{% elseif user|length not in 3..15 %}
    {% set notice = 'độ dài tên tài khoản phải lơn hơn 3 và nhỏ hơn 15' %}
    {% set color = 'red' %}
{% elseif pass != repass %}
    {% set notice = 'mật khẩu xác nhận không chính xác' %}
    {% set color = 'red' %}
{% else %}
    {% if user matches '/^+$/' %}
      {% set notice = 'tạo tài khoản thành công' %}
      {% set color = 'green' %}
      {% do insert_rows_table('users', {"user":user,"pass":save_pass,"token":save_token,"reg":'now'|date('U')}) %}
      {{set_cookie('username',save_token)}}
      {% do set_session('timereg','now'|date('U')+300) %}
    {% else %}
      {% set notice = 'tên tài khoản có chứa ký tự đặc biệt' %}
      {% set color = 'red' %}
    {% endif %}
{% endif %}
{% else %}
{% set notice = 'vui lòng điền đầy đủ thông tin' %}
{% set color = 'red' %}
{% endif %}

{# === DUYỆT ĐẦU VÀO === #}
{% endif %}

<div class="title">Đăng ký</div>
<div class="typewrite">
    <div class="menu" style="text-align:center">
      {% if notice and color %}<span style="font-weight:700;color:{{color}}">{{notice}}</span>{% endif %}
      <p>
            <form action="" method="post">
                <b>Tên đăng nhập:</b><br>
                <input placeholder="Tên đăng nhập" type="text" name="user" value="{{form_post('user')}}" maxlength="15"><br>
                <b>Mật khẩu:</b><br>
                <input placeholder="Mật khẩu" type="password" name="pass" maxlength="32"><br>
                <b>Xác nhận mật khẩu:</b><br>
                <input placeholder="Nhập lại mật khẩu" type="password" name="repass" maxlength="32"><br>
                <button type="submit">Đăng ký</button>
            </form>
      </p>
    </div>
</div>

3. Viết chức năng đăng nhập

{% if SERVER_REQUEST_METHOD|lower == 'post' %}
{# === DUYỆT ĐẦU VÀO === #}
{% set user = form_post('user')|lower %}
{% set pass = md5(user~md5(form_post('pass'))) %}
{% set user_data = select_table_row_data_by_where('users', {'user':user,'pass':pass}) %}
{# === KIỂM TRA === #}
{% if user_data['user'] == user and user_data['pass'] == pass %}
{{set_cookie('username',user_data['token'])}}
{% set notice = 'Đăng nhập thành công!' %}
{% set color = 'green' %}
<script>window.location.href='/'</script>
{% else %}
{% set notice = 'thông tin đăng nhập không chính xác' %}
{% set color = 'red' %}
{% endif %}
{# === DUYỆT ĐẦU VÀO === #}
{% endif %}

<div class="title">Đăng nhập</div>
<div class="typewrite">
    <div class="menu" style="text-align:center">
      {% if notice and color %}<span style="font-weight:700;color:{{color}}">{{notice}}</span>{% endif %}
      <p>
            <form action="" method="post">
                <b>Tên đăng nhập:</b><br>
                <input placeholder="Tên đăng nhập" type="text" name="user" value="{{form_post('user')}}" maxlength="32"><br>
                <b>Mật khẩu:</b><br>
                <input placeholder="Mật khẩu" type="password" name="pass" maxlength="32"><br>
                <center><button type="submit">Đăng nhập</button></center>
            </form>
      </p>
    </div>
</div>

4. Viết hàm is_login() để kiểm tra xem người dùng đã đăng nhập hay chưa.
Cách viết hàm này rất dễ hiểu như sau: Lấy dữ liệu từ trường `token` trong bảng `users` rồi check với cookie hoặc session. Vì ở phía trên, mình đã sử dụng cookie để duy trì phiên đăng nhập, nên với hàm is_login() này, mình vẫn tiếp tục sử dụng cookie. Code như sau:

File '_functions'

{% macro is_login() %}
{% set token = get_cookie('username')|default('guest') %}
{% set user_data = select_table_row_data_by_where('users', {'token':token}) %}
{% if user_data['token'] == token %}
    {{user_data['user']}}
{% endif %}
{% endmacro %}

Cách sử dụng:

{% from '_functions' import is_login %}
{% if is_login() %}
Nội dung dành cho người dùng đã đăng nhập
{% else %}
Nội dung hiển thị đối với khách
{% endif %}
Trang: [1]
Phiên bản đầy đủ: Hướng dẫn tạo hàm check người dùng đăng nhập