Пользователь может вручную редактировать другое представление пользователя по URL - PullRequest
0 голосов
/ 18 марта 2020

Я только что заметил, что пользователь может вручную получить доступ к просмотру профиля обновления других пользователей, изменив для других пользователей pk или имя пользователя (как slug) в URL. например,

http://127.0.0.1:8000/account/dashboard/18/updateprofile

Допустим, что это URL-адрес профиля обновления пользователей, если этот пользователь изменит pk на 19 и отредактирует, будет отредактирован пользователь с профилем pk 19, это ошибка или это ошибка с моей стороны? Спасибо.

мой взгляд здесь

class ProfilepdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    login_url = 'userlogin'
    fields = ('age', 'location')
    model = UserProfile
    template_name = 'account/updateprofile.html'
    success_message = "Your profile was successfully updated"

url

path('account/dashboard/<int:pk>/updateprofile', views.ProfilepdateView.as_view(), name="updateprofile"),

Ответы [ 3 ]

5 голосов
/ 18 марта 2020

Вам решать, кто может что делать и где - Django не может догадаться. У вас есть два решения:

1 / сохраните ваш URL-адрес как есть, но проверьте, разрешено ли текущему пользователю (request.user) редактировать этот профиль:

def update_profile(request, profile_id):
    # assume that profile as a onetone to User
    profile = get_object_or_404(pk=profile_id)
    if request.user != profile.user:
        return HttpResponseForbidden()
    # your code here

2 / удалить profile_id из URL и использовать request.user, чтобы получить профиль текущего пользователя

def update_profile(request, profile_id):
    # assume that profile as a onetone to User
    profile = request.user.get_profile()
    # your code here
1 голос
/ 18 марта 2020

Спасибо всем моим способным БОССАМ и МАСТЕРАМ, это было то, что я добавил к своему мнению, чтобы решить проблему.

def get_queryset(self):
    profile= super().get_queryset()
    return profile.filter(user=self.request.user)

Окончательный вид такой:

class ProfilepdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    login_url = 'userlogin'
    fields = ('age', 'location')
    model = UserProfile
    template_name = 'account/updateprofile.html'
    success_message = "Your profile was successfully updated"

    def get_queryset(self):
        profile= super().get_queryset()
        return profile.filter(user=self.request.user)
0 голосов
/ 18 марта 2020

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

    {% if object.user == user %} Show Page Content {% endif %}

или прямо на виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...