2009-10-22 7 views
3

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

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

Таким образом, очевидно, я не хочу пользователя «джонни» редактировать инфо принадлежащий пользователю 'jimmy', просто указав свой браузер на/jimmy/info/edit /. Вышеупомянутые работы, но я обеспокоен тем, что мне не хватает чего-то здесь, насколько безопасность идет. Правильно ли это? Спасибо.

+2

Я был бы фанатом в ответ с кодом ошибки 403 в вашем 'else' блока. –

ответ

2

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

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

+0

Я вижу. Я думал о том, чтобы позволить пользователям просматривать информацию других людей, но редактирование должно быть ограничено только персональными данными, конечно. – sa125

0

С помощью @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> 
Смежные вопросы