Django: не разрешать пользователям просматривать страницы, когда данные для входа не совпадают с данными пользовательских моделей - PullRequest
0 голосов
/ 03 июля 2018

У меня есть пользовательская модель, в которой хранятся данные для входа:

class UserRegistration(models.Model):
    # Auto updated when data is inserted
    created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
    # Auto updated when data is altered
    updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)

    username = models.CharField(max_length=255, null=True)
    password = models.CharField(max_length=255, null=True)
    first_name = models.CharField(max_length=255, null=True)
    last_name = models.CharField(max_length=255, null=True)

    def __str__(self):
        return self.first_name

urls.py is

url(r'^login/$', view.login_page, name='login_page'),

views.py is

def login_page(request):
    if request.method == 'GET':
        return render(request, "login_page.html")

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print username, password
        credentials_matches = False  # considering credentials are wrong

        all_users = UserRegistration.objects.all()
        for user in all_users:
            if user.username == username and user.password == password:
                credentials_matches = True
                break

        if credentials_matches:
            return HttpResponse('success')
            # return redirect("http://127.0.0.1:8000/lmtech")
        else:
            return HttpResponse('fail')

У меня есть другие представления, которые я не хочу показывать пользователю, если они не вошли в систему. Я думаю о @login_required (), но в этом случае пользовательские данные находятся в пользовательской модели. Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

В вашей пользовательской модели вы хотите указать имя, фамилию, имя, имя пользователя и пароль, в пользовательской модели от django у вас есть только адрес электронной почты, который является необязательным. Поэтому вы можете создать пользователя с помощью модели django, а затем использовать отношение, чтобы получить два других атрибута, которые вы хотите.

Вот пример

class User(models.Model):
  username = models.CharField()
  password
  ...

class UserMore(models.Model):
  user = models.OneToOneField(User)
  created_at = ...
  updated_at = ...

  def __str__(self):
    return self.user.username

В этом случае вы можете использовать @login_required() django. Лично, это как я.

Но если вы действительно хотите сохранить свою пользовательскую модель без пользовательской модели Django, возможно, вы можете оставить пользователя в сеансе, который вы инициируете, в виде входа в систему, а затем при выходе из системы удалить его. Таким образом, вы можете легко проверить, определен ли request.session['username'] или нет.

0 голосов
/ 03 июля 2018

Вы не должны создавать пользовательскую модель, подобную этой. Написание собственной системы аутентификации всегда небезопасно.

Вы должны использовать стандартную встроенную среду аутентификации - вы можете заменить свою собственную модель пользователя, но она должна наследоваться от AbstractBaseUser, см. документы . Однако, кажется, нет особой причины для этого, поскольку вы не добавляете никаких пользовательских функций.

...