使用Django中的身份验证信息登录URL

时间:2010-06-02 14:22:54

标签: django django-urls

我正在为我的大学开设在线实验室注册平台。

登录视图[project views.py]

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response

from django.template import RequestContext
from django.contrib import auth

def index(request):
    return render_to_response('index.html', {}, context_instance = RequestContext(request))

def login(request):
    if request.method == "POST":
        post = request.POST.copy()
        if post.has_key('username') and post.has_key('password'):
            usr = post['username']
            pwd = post['password']
            user = auth.authenticate(username=usr, password=pwd)
            if user is not None and user.is_active:
                auth.login(request, user)
                if user.get_profile().is_teacher:
                    return HttpResponseRedirect('/teachers/'+user.username+'/')
                else:
                    return HttpResponseRedirect('/students/'+user.username+'/')
            else:
                return render_to_response('index.html', {'msg': 'You don\'t belong here.'}, context_instance = RequestContext(request)

    return render_to_response('login.html', {}, context_instance = RequestContext(request))


def logout(request):
    auth.logout(request)

    return render_to_response('index.html', {}, context_instance = RequestContext(request))

URLS

#========== PROJECT URLS ==========#

urlpatterns = patterns('',
    (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT }),
    (r'^admin/', include(admin.site.urls)),

    (r'^teachers/', include('diogenis.teachers.urls')),
    (r'^students/', include('diogenis.students.urls')),
    (r'^login/', login),
    (r'^logout/', logout),
    (r'^$', index),
)

#========== TEACHERS APP URLS ==========#

urlpatterns = patterns('',
    (r'^(?P<username>\w{0,50})/', labs),
)

登录视图基本上通过get_profile()检查登录用户是否__teacher [UserProfile属性],并将用户重定向到他的个人资料。

实验室视图[教师应用视图.py]

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response

from django.template import RequestContext
from django.contrib.auth.decorators import user_passes_test

from django.contrib.auth.models import User
from accounts.models import *
from labs.models import *

def user_is_teacher(user):
    return user.is_authenticated() and user.get_profile().is_teacher

@user_passes_test(user_is_teacher, login_url="/login/")
def labs(request, username):
    q1 = User.objects.get(username=username)
    q2 = u'%s %s' % (q1.last_name, q1.first_name)
    q2 = Teacher.objects.get(name=q2)
    results = TeacherToLab.objects.filter(teacher=q2)

    return render_to_response('teachers/labs.html', {'results': results}, context_instance = RequestContext(request))

我正在使用@user_passes_test装饰器来检查经过身份验证的用户是否有权使用此视图[实验室视图]。

我对当前逻辑的问题是,一旦Django验证教师用户,他基本上可以通过在网址中键入教师用户名来访问所有教师资料。 一旦教师找到同事的用户名,他就可以直接访问他的数据。

我们非常感谢任何建议。

3 个答案:

答案 0 :(得分:2)

一种简单的方法是修改视图以添加额外的检查:

@user_passes_test(user_is_teacher, login_url="/login/")
def labs(request, username):
    if username != request.user.username:
        return HttpResponseNotAllowed()
    ... and so on ...

答案 1 :(得分:0)

假设您有一个名为“老师”的变量来表示您正在查看其个人资料的教师的个人资料,请在视图的早期执行以下操作:

if request.user.get_profile() != teacher:
  ..redirect, throw 404, whatever you fancy 

答案 2 :(得分:0)

只是一个简短的提示。

...

user = request.user
enrollment = get_object_or_404(Enrollment, id=enrollment_id)
profile = get_object_or_404(Profile, user=user)

if not (enrollment.profile == profile or user.is_staff):
    raise Http404

...

enrollment.delete()

我们使用此类if语句来确定实际用户和他请求的操作是否匹配。在上面的示例中,只允许创建注册的profile删除(或staff权限的人。)