рдПрдХ Django рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреВрдорд▓рд╛ рдЦрд╛рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯ рдЬреВрдорд▓рд╛ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЙрддреНрдкрд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рдкрд╛рдпрдерди / рдЬрд┐рдВрдЧреЛ рдмрдВрдбрд▓ рдХреЛ рдЪреБрдирд╛ред


рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдЬрд┐рдУрдЧреЛ рдореЗрдВ рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреВрдорд▓рд╛ рдФрд░ Django рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЦрд╛рддреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред


Django рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛, рдЬреЛ Django рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдЪреЗрддрд╛рд╡рдиреА


рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдкрд╕рдВрдж рди рдЖрдП, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВред


рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Django рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдХреБрдЫ рд╕рдордЭ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ Django рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред


рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред


рд╕рдВрднрд╡рддрдГ, Django рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдХреЛрдб рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛ред


рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдореИрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐:


  • рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рд╣реИ рд╡рд╣ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ JSON API рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
  • рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Django рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдЯрд╛рд░реНрдЯрд░ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рд╣реИ

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


  • рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ (DB) рдХреЛ Django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
  • рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЬреВрдорд▓рд╛рдЙрдЬрд╝рд░ рдореЙрдбрд▓ рдмрдирд╛рдПрдБ
  • рдПрдХ check_joomla_password() рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдореВрд▓ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  • рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмреИрдХрдПрдВрдб "рдЬреБрдорд▓рд╛ рдСрдереЗрдВрдЯрд┐рдХ рдмреИрдХрдПрдВрдб" рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЬрдм Django рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рдорд┐рд▓реЗрдЧрд╛

1. рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди:


  • рдкрдврд╝реЗрдВ рдХрд┐ рдХреИрд╕реЗ Django рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  • рдЬреВрдорд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╣рдорд╛рд░реЗ Django рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ /project_name/settings.py :


     DATABASES = { #    'default': { ... }, 'joomla_db': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': {}, 'NAME': 'joomla_database_name', # Don't store passwords in the code, instead use env vars: 'USER': os.environ['joomla_db_user'], 'PASSWORD': os.environ['joomla_db_pass'], 'HOST': 'joomla_db_host, can be localhost or remote IP', 'PORT': '3306', } } 


рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 # add logging to see DB requests: LOGGING = { 'version': 1, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['console'], }, }, } 

2. рдПрдХ рдЬреВрдорд▓реЗрдЙрд╕рд░ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ


  • рдкрдврд╝реЗрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ Django рдореЙрдбрд▓ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдирдпрд╛ рдЬреВрдорд▓рд╛рдЙрдЬрд╝рд░ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред
    рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдирд╛рдордХ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ ( manage.py startapp users )ред рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмреИрдХрдПрдВрдб рдФрд░ рдЬреВрдорд▓рд╛ рдпреВрдЬрд░ рдореЙрдбрд▓ рд╣реЛрдЧрд╛ред
  • рдЗрдВрд╕реНрдкреЗрдХреНрдЯрдбрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:
    python manage.py inspectdb live_users --database="joomla_db"
    joomla_db - рдЙрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо, рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ settings.py/DATABASES рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛/DATABASES;
    live_users - рдЦрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдоред
  • рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ users/models.py рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗрдВ:


     class JoomlaUser(models.Model): """ Represents our customer from the legacy Joomla database. """ username = models.CharField(max_length=150, primary_key=True) email = models.CharField(max_length=100) password = models.CharField(max_length=100) # you can copy more fields from `inspectdb` output, # but it's enough for the example class Meta: # joomla db user table. WARNING, your case can differs. db_table = 'live_users' # readonly managed = False # tip for the database router app_label = "joomla_users" 


рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рд╕рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЬреВрдорд▓реЗрдЙрд╕рд░ рдореЙрдбрд▓ рд╕реЗ рдЗрд╕рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред


  1. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореБрдЦреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ "db_routers.py" рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ (рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдЬрд╣рд╛рдБ рдЖрдкрдХрд╛ "settings.py" рд╣реИ:


     # project_name/db_routers.py class DbRouter: """this router makes sure that django uses legacy 'Joomla' database for models, that are stored there (JoomlaUser)""" def db_for_read(self, model, **kwargs): if model._meta.app_label == 'joomla_user': return 'joomla_db' return None def db_for_write(self, model, **kwargs): if model._meta.app_label == 'joomla_user': return 'joomla_db' return None 

  2. settings.py рдореЗрдВ рдПрдХ рдирдпрд╛ рд░рд╛рдЙрдЯрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:


     # ensure that Joomla users are populated from the right database: DATABASE_ROUTERS = ['project_name.db_routers.DbRouter'] 


рдЕрдм рдЖрдк рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдЦрд╛рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ Django рдЯрд░реНрдорд┐рдирд▓ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: python manage.py shell


 >>> from users.models import JoomlaUser >>> print(JoomlaUser.objects.get(username='someuser')) JoomlaUser object (someusername) >>> 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ), рддреЛ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред рдЕрдиреНрдпрдерд╛, рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░реЗрдВред


3. рдЬреВрдорд▓рд╛ рдЦрд╛рддрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреВрдорд▓рд╛ рдпреВрдЬрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
$2y$10$aoZ4/bA7pe.QvjTU0R5.IeFGYrGag/THGvgKpoTk6bTz6XNkY0F2e


Joomla v3.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕рд╡рд░реНрдб BLOWFISH рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЕрдЬрдЧрд░ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛:


 pip install bcrypt echo bcrypt >> requirements.txt 

рдФрд░ users/backend.py рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛:


 def check_joomla_password(password, hashed): """ Check if password matches the hashed password, using same hashing method (Blowfish) as Joomla >= 3.2 If you get wrong results with this function, check that the Hash starts from prefix "$2y", otherwise it is probably not a blowfish hash :return: True/False """ import bcrypt if password is None: return False # bcrypt requires byte strings password = password.encode('utf-8') hashed = hashed.encode('utf-8') return hashed == bcrypt.hashpw(password, hashed) 

рдЪреЗрддрд╛рд╡рдиреА! 3.2 рд╕реЗ рдХрдо Joomla рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдЕрд▓рдЧ рд╣реИрд╢рд┐рдВрдЧ рд╡рд┐рдзрд┐ (md5 + рдирдордХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдврд╝реЗрдВ
Stackoverflow рдкрд░ рдЪрд░реНрдЪрд╛ рдФрд░ рдПрдХ рд╣реИрд╢ рдЪреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 # WARNING - THIS FUNCTION WAS NOT TESTED WITH REAL JOOMLA USERS # and definitely has some errors def check_old_joomla_password(password, hashed): from hashlib import md5 password = password.encode('utf-8') hashed = hashed.encode('utf-8') if password is None: return False # check carefully this part: hash, salt = hashed.split(':') return hash == md5(password+salt).hexdigest() 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдЬреВрдорд▓рд╛ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред


4. рдмреИрдХрдПрдВрдб рдпреВрдЬрд░ рдСрдерд░рд╛рдЗрдЬреЗрд╢рди рдЬреВрдорд▓рд╛


рдЕрдм рдЖрдк рдЬреВрдорд▓рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Django рдмреИрдХрдПрдВрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред


  1. рдХреИрд╕реЗ Django рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝реЗрдВ


  2. project/settings.py рдореЗрдВ рдПрдХ рдирдпрд╛ рдмреИрдХрдПрдВрдб (рдЕрднреА рддрдХ рд╡рд┐рджреНрдпрдорд╛рди рдирд╣реАрдВ) рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:


     AUTHENTICATION_BACKENDS = [ # Check if user already in the local DB # by using default django users backend 'django.contrib.auth.backends.ModelBackend', # If user was not found among django users, # use Joomla backend, which: # - search for user in Joomla DB # - check joomla user password # - copy joomla user into Django user. 'users.backend.JoomlaBackend', ] 

  3. users/backend.py backend.py рдореЗрдВ рдПрдХ рдЬреВрдорд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмреИрдХрдПрдВрдб рдмрдирд╛рдПрдВ



 from django.contrib.auth.models import User from .models import JoomlaUser def check_joomla_password(password, hashed): # this is a fuction, that we wrote before ... class JoomlaBackend: """ authorize users against Joomla user records """ def authenticate(self, request, username=None, password=None): """ IF joomla user exists AND password is correct: create django user return user object ELSE: return None """ try: joomla_user = JoomlaUser.objects.get(username=username) except JoomlaUser.DoesNotExist: return None if check_joomla_password(password, joomla_user.password): # Password is correct, let's create and return Django user, # identical to Joomla user: # but before let's ensure there is no same username # in DB. That could happen, when user changed password # in Joomla, but Django doesn't know that User.objects.filter(username=username).delete() return User.objects.create_user( username=username, email=joomla_user.email, password=password, # any additional fields from the Joomla user: ... ) # this method is required to match Django Auth Backend interface def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None 

рд╕рдВрдкреВрд░реНрдг


рдмрдзрд╛рдИ - рдЕрдм рдЖрдкрдХреА рдореМрдЬреВрджрд╛ Joomla рд╕рд╛рдЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирдИ рд╕рд╛рдЗрдЯ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЕрдкрдиреА рд╕рд╛рдЦ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдирдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдирдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдирдП рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣рд╛рдВ рдПрдХ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЛ Django (рдКрдкрд░ рд╡рд░реНрдгрд┐рдд JoomlaUser рдореЙрдбрд▓) рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП ред


рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕ рд╕рдВрдмрдВрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирдИ рдФрд░ рдкреБрд░рд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реЛрдВрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛, рдХреМрди рд╕рд╛ рд╕рд╛рдЗрдЯ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореБрдЦреНрдп рд╣реЛрдЧрд╛, рдЖрджрд┐ред


рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд▓реЗрдЦрди


рдЕрдм рдХреГрдкрдпрд╛ рдирдП рдХреЛрдб рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реБрдП рдЙрдЪрд┐рдд рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рддрд░реНрдХ рдмрд╛рд░реАрдХреА рд╕реЗ Django рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЕрднреА рдкрд░реАрдХреНрд╖рдг / рдкреНрд░рд▓реЗрдЦрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/hi442592/


All Articles