django - ограничить пользователей редактировать только их собственную информацию - PullRequest
4 голосов
/ 22 октября 2009

Я играю с django и создал небольшое приложение, где пользователь может получить доступ к своей информации через URL http: /// localhost: 8000 / username / info / . Я хочу добавить возможность редактировать эту информацию через http: /// localhost: 8000 / username / info / edit / , но также хочу убедиться, что в данный момент вошел в систему пользователь (используя django.contrib. auth) может получить доступ только к его информации. Я сделал это, выполнив в представлении следующее (имя пользователя в аргументах представления захватывается из URL):

@login_required
def edit_info(request, username=''):
    if request.user.username == username:
        # allow accessing and editing the info..
    else:
        # redirect to some error page

Итак, очевидно, я не хочу, чтобы пользователь 'johnny' редактировал информацию, принадлежащую пользователю 'jimmy', просто указывая свой браузер на / jimmy / info / edit /. Вышесказанное работает, но меня беспокоит то, что я что-то здесь упускаю, что касается безопасности. Это правильный путь? Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 октября 2009

Это должно работать на то, что вы пытаетесь сделать без каких-либо явных угроз безопасности.

Но зачем показывать свое имя пользователя, если никто не видит хотя бы профиль или что-то еще в этом месте? Разве это не было бы больше похоже на страницу «аккаунта»? Тогда вы не будете проверять имя пользователя в URL-адресе, единственным URL-адресом, на который вы сможете перейти, будет аккаунт, и он просто загрузит информацию о зарегистрированном пользователе.

1 голос
/ 22 октября 2009

С @login_required и анализом request.user они никогда не попадут в чужой профиль. Мой профиль

@login_required
def user_profile(request):
    """ User profile page """
    u = User.objects.get(pk=request.user.pk)

    return render_to_response('myapp/user_profile.html', {
                                'user': request.user,
                                })

Тогда в шаблоне просто используйте такие вещи, как:

Welcome <b>{{ user.first_name }} {{ user.last_name }}</b>
...