הקדמה
אימות הוא התהליך של אימות זהותם של משתמשים במהלך בקשות התחברות. בתהליך האימות, המשתמשים מגישים את פרטי הכניסה שלהם כשמות משתמש וסיסמאות. לאחר מכן, היישום מתאים את פרטי הכניסה הללו לרשומות מסד הנתונים השמורות. היישום מעניק גישה למשתמשים למערכת אם קיימת התאמה.
שמירת פרטי הכניסה במסד נתונים יחסי כמו MySQL או PostgreSQL בלי מנגנון מטמון הוא עדיין גישה נפוצה ומעשית, אך היא מגיעה עם הגבלות הבאות:
-
תומכת את המסד. היישום חייב לבצע נסיעה חוזרת לשרת בסיס הנתונים כדי לאמת את פרטי הכניסה של המשתמשים מטבלת מסד הנתונים בכל פעם שמשתמש מגיש בקשת התחברות. מאחר והמסד עשוי עדיין לשרת בקשות קריאה/כתיבה אחרות, התהליך כולו מעמיס את מסד הנתונים והופך אותו לאיטי.
-
למסדי נתונים המבוססים על דיסק יש בעיות קינון. כשיישום שלך מקבל אלפי בקשות בשנייה, מסדי הנתונים המבוססים על דיסק אינם פועלים ביעילות מיטבית.
כדי להתמודד עם האתגרים מפורטים לעיל, תוכל להשתמש ב־Redis כדי למטמיע את פרטי הכניסה של המשתמשים כדי שהיישום שלך לא יצטרך ליצור קשר עם מסד הנתונים האחורי בכל בקשת כניסה. Redis הוא אחד מאחסני המידע המהירים ביותר והם משתמשים בזיכרון המרכזי של המחשב שלך כדי לאחסן נתונים בצורת מפתח־ערך. במדריך הזה, תשתמש במסד הנתונים של Redis כדי לשפר את טיפול ההפעלות במושב ביישום הפייתון/MySQL שלך על שרת Ubuntu 22.04.
דרישות מוקדמות
לפני שתתחיל במדריך הזה, יהיה עליך להגדיר את ההגדרות הבאות:
-
החלף לחשבון משתמש ה-
sudo
החדש והתקן:
שלב 1 — התקנת מנהלי מסדי נתונים ל־Redis ו־MySQL
היישום הזה מאחסן לצמיתות את פרטי המשתמשים, כגון שמות וסיסמאות, בשרת מסד הנתונים MySQL. כאשר משתמש מתחבר ליישום, סקריפט בפייתון מבצע שאילתה למסד הנתונים של MySQL ומשווה את הפרטים עם הערכים המאוחסנים. לאחר מכן, הסקריפט בפייתון מאחסן במטמון במסד הנתונים של Redis את פרטי ההתחברות של המשתמש לשימוש בבקשות עתידיות. כדי להשלים את הלוגיקה הזו, הסקריפטים שלך בפייתון דורשים מנהגי מסדי הנתונים (מודולים בפייתון) כדי לתקשר עם שרתי MySQL ו-Redis. עקוב אחר השלבים הבאים כדי להתקין את המנהגים הדרושים:
- עדכן את אינדקס המידע של החבילות שלך והרץ את הפקודה הבאה כדי להתקין את
python3-pip
, מנהל החבילות של פייתון שמאפשר לך להתקין מודולים נוספים שאינם חלק מספריית התקנה הסטנדרטית של פייתון.
- התקן את מנהג ה-MySQL עבור פייתון:
- התקן את מנהג ה-Redis עבור פייתון:
לאחר התקנת המנהגים הדרושים לתקשורת עם MySQL ו-Redis, המשך לשלב הבא ואתחל את מסד הנתונים של MySQL.
שלב 2 — הגדרת מסד נתונים דוגמתי של MySQL
עבור מדריך זה, נדרשת לך טבלה אחת של MySQL. בסביבת ייצור, ניתן להיות לך עשרות טבלאות המכילות בקשות אחרות. הגדר מסד נתונים וצור את הטבלה על ידי ביצוע הפקודות הבאות:
-
התחבר לשרת מסד הנתונים MySQL כמשתמש
root
: -
הזן את הסיסמה של שרת מסד הנתונים MySQL שלך כשתתבקש ולחץ על
ENTER
כדי להמשיך. לאחר מכן, הרץ את הפקודה הבאה כדי ליצור מסד נתונים דוגמה בשםcompany
וחשבון משתמש בשםcompany_user
. החלף אתexample-mysql-password
בסיסמה חזקה:
-
ודא שאתה מקבל את הפלט הבא כדי לאשר שהפקודות הקודמות הורצו בהצלחה:
-
החלף לבסיס הנתונים החדש של החברה:
-
וודא שאתה מחובר לבסיס הנתונים החדש על ידי אימות הפלט הבא:
-
צור טבלה בשם
system_users
. עמודתuser_id
משמשת כמפתח ראשי לזיהוי ייחודי של כל משתמש. עמודותusername
ו-password
הן פרטי התחברות שמשתמשים חייבים להזין כדי להתחבר ליישום. עמודותfirst_name
ו-last_name
מאחסנות את שמות המשתמשים: -
וודא שיצרת את הטבלה החדשה על ידי בדיקת הפלט הבא:
-
מלא את טבלת
system_users
בדוגמאות נתונים. השתמש בפונקציית ה-MD5(...)
המובנית של MySQL כדי להצפין את הסיסמה למטרות אבטחה: -
אמת את הפלט למטה:
-
שאילתה את טבלת
system_users
כדי לוודא שהנתונים ממוקמים: -
אמת את הפלט הבא:
-
התנתק ממסד הנתונים של MySQL:
עכשיו הגדרת את מסד הנתונים של MySQL הנכון עבור היישום שלך. בשלב הבא, תכין מודול Python שמתקשר עם מסד הנתונים הדוגמה שלך.
שלב 3 — יצירת מודול MySQL Gateway מרכזי עבור Python
בעת כתיבת כל פרויקט Python, עליך ליצור מודול נפרד עבור כל משימה כדי לקדם את ריאות הקוד. בשלב זה, תכין מודול מרכזי שמאפשר לך להתחבר ולשאול את מסד הנתונים של MySQL מתוך סקריפט Python. עקוב אחר השלבים שלמטה:
-
צור תיקיית
project
. התיקייה הזו מפרידה את קבצי קוד המקור שלך בפייתון משאר קבצי המערכת: -
עבור לתיקיית
project
החדשה: -
השתמש בעורך הטקסט
nano
כדי לפתוח קובץ חדש בשםmysql_db.py
. קובץ זה מארח את המודול בפייתון שמתקשר עם בסיס הנתונים MySQL: -
הזן את המידע הבא לתוך קובץ
mysql_db.py
. החלף אתexample-mysql-password
בסיסמת MySQL הנכונה עבור החשבוןcompany_user
:~/project/mysql_db.py -
שמור את הקובץ
mysql_db.py
וסגור אותו.
בקובץ המודול mysql_db.py
ישנה מחלקה אחת (MysqlDb:
) עם שני שיטות:
– db_con(self):
, מתחבר למסד הנתונים company
הדוגמה שיצרת בשלב הקודם ומחזיר חיבור MySQL שניתן לשימוש באמצעות ההצהרה return mysql_con
.
– query(self, username, password):
, שיטה שמקבלת username
ו-password
ומחפשת בטבלת system_users
אם יש התאמה. ביטוי התנאי if row_count < 1: ... else: return result[1]
מחזיר את הערך הבוליאני False
אם המשתמש אינו קיים בטבלה או את הסיסמה של המשתמש (result[1]
) אם היישום מוצא התאמה.
עם המודול MySQL מוכן, עקוב אחר השלב הבא כדי להגדיר מודול Redis דומה שמתקשר לאחסון מפתחות Redis.
שלב 4 — יצירת מודול Redis מרכזי עבור Python
בשלב זה, תכתב מודול שמתחבר לשרת Redis. בצע את השלבים הבאים:
-
פתח קובץ חדש בשם
redis_db.py
: -
הזן את המידע הבא לקובץ
redis_db.py
. החלףexample-redis-password
בסיסמה הנכונה עבור שרת ה-Redis:~/project/redis_db.py -
שמור וסגור את קובץ
redis_db.py
.
-
בקובץ לעיל יש תיקייה אחת (
RedisDb:
). -
תחת התיקייה הזו, השיטה
db_con(self):
משתמשת בפרטי הכניסה המסופקים כדי להתחבר לשרת Redis ולהחזיר חיבור המשתמש באמצעות ההצהרהreturn redis_con
.
לאחר שהגדרת את מחלקת Redis, צור את קובץ המרכז של הפרויקט בשלב הבא.
שלב 5 — יצירת נקודת הכניסה של היישום
לכל היישום בפייתון חייבת להיות נקודת כניסה או קובץ הראשי שמופעל כאשר היישום מתבצע. בקובץ זה, תיצור קוד שמציג את הזמן הנוכחי של השרת עבור משתמשים מאומתים. קובץ זה משתמש במודולים המותאמים אישית של MySQL ו-Redis שיצרת כדי לאמת משתמשים. עקוב אחר השלבים הבאים כדי ליצור את הקובץ:
-
פתח קובץ חדש בשם
index.py
: -
הזן את המידע הבא לקובץ
index.py
:~/project/index.py -
שמור וסגור את קובץ index.py
-
בקובץ index.py, בסעיף הייבוא (
import...
) הוסף את המודולים הבאים לפרויקט שלך:-
utf_8
,base64
,md5
, ו־json
– מודולים לקידוד ועיצוב טקסט. -
http.server
,HTTPStatus
, ו־socketserver
– מודולים לשרת רשת. -
datetime
– מודול לטיפול בזמן ותאריך. -
mysql_db
ו־redis_db
– מודולים מותאמים אישית שנוצרו מראש כדי לגשת לשרתי MySQL ו־Redis.
-
-
המחלקה
HttpHandler(http.server.SimpleHTTPRequestHandler):
היא מחלקת מטפלת עבור שרת ה-HTTP. תחת המחלקה, השיטהdo_GET(self):
מטפלת בבקשות ה-HTTP מסוג GET ומציגה את תאריך/שעת המערכת עבור משתמשים מאומתים. -
בלוגיקת ה־
if ... : else: ...
, התסריט בפייתון מפעיל את ההצהרה הלוגיתif redis_client.exists(auth_user):
כדי לבדוק האם פרטי המשתמש קיימים בשרת ה־Redis. אם פרטי המשתמש קיימים והסיסמה שמורה ב־Redis אינה תואמת את הסיסמה שהמשתמש הזין, היישום מחזיר את השגיאה{"error": "שם משתמש/סיסמה לא חוקיים."}
.
אם פרטי המשתמש אינם קיימים בשרת Redis, היישום מבצע שאילתה לשרת מסד הנתונים MySQL באמצעות ההצהרה mysql_resp = mysql_server.query(auth_user, auth_password)
. במקרה שבו הסיסמה שסופקה על ידי המשתמש אינה תואמת את הערך המאוחסן במסד הנתונים, היישום מחזיר את השגיאה {"error": "שם משתמש/סיסמה לא תקינים."}
. אחרת, היישום מאחסן את פרטי המשתמש בשרת Redis באמצעות ההצהרה redis_client.set(auth_user, mysql_resp)
.
-
בכל המקרים בהם הפרטים של המשתמש תואמים לפרטי Redis/MySQL, היישום מציג את תאריך/שעת המערכת הנוכחית באמצעות ההצהרה
{"time": current_time, ...}
. הערךauthorized by
בפלט מאפשר לך לראות את שרת המסד נתונים שמאמת את המשתמשים ביישום.
כעת הגדרת את הקובץ הראשי לאפליקציה. בשלב הבא תבדוק את האפליקציה.
שלב 6 — בדיקת האפליקציה
בשלב זה, תפעיל את האפליקציה כדי לבדוק אם המנגנון המטמון של Redis פועל. בצע את הפקודות הבאות כדי לבדוק את האפליקציה:
-
השתמש בפקודה
python3
הבאה כדי להפעיל את האפליקציה: -
ודא ששרת האינטרנט המותאם אישית של האפליקציה פועל:
-
צור חיבור SSH נוסף לשרת שלך בחלון טרמינל חדש והרץ את הפקודות
curl
הבאות כדי לשלוח ארבעה בקשות GET באמצעות הפרטים המזהים שלjohn_doe
. הוסף[1-4]
בסוף כתובת ה-URLhttp://localhost:8080/
כדי לשלוח את הבקשות הארבע בפקודה יחידה: -
אמת את הפלטים הבאים. השרת של MySQL מכין את הבקשה הראשונה לאימות. לאחר מכן, מסד הנתונים של Redis מכין את הבקשות הבאות שלוש.
הלוגיקה של היישום שלך עובדת כפי שצפוי.
מסקנה
במדריך זה, בנית התוכנה שלך בשפת פייתון שמשתמשת בשרת ה-Redis כדי לאחסן באופן מטמון את פרטי הכניסה של המשתמשים. Redis הוא שרת מסד נתונים זמין וקלט גודל שיכול לבצע אלפי עסקאות בשניה. בעזרת מנגנון המטמון של Redis ביישום שלך, אתה יכול להפחית מאוד את התעבורה בשרת מסד הנתונים האחורי שלך. כדי ללמוד עוד על יישומי Redis, יש לעיין במדריכים שלנו ב-Redis.