2014-06-20 3 views
1

나는 세 가지 유형의 사용자 인 ["client" , "volunteer" , "coordinator"]을 가진 작은 웹 사이트를 만들려고합니다. 각 사용자 유형에는 액세스 할 수있는보기에 대한 제한 사항이 있습니다. 3 명의 사용자 모두 다른 로그인 페이지를 사용합니다.Django에서 여러 사용자 유형을 처리하는 방법

접근 1 :는이를 위해, 나는, 뷰가 호출 될 때마다 위의 주어진 로그인시 userTypes 및 중 하나에 할당 해당 사용자가보기에 액세스 할 수 있는지 여부를 확인 세션 category에 키를 추가했습니다.

login.html :

{% extends "base.html" %} 
{% block content %} 

{% if form.errors %} 
    <p class="error"> Sorry , invalid</p> 
{% endif %} 

    <form action="/login_volunteer/authenticate/" method="post">{% csrf_token %} 
    <label for="username"> Username : </label> 
    <input type="text" name="username" value="" id="username"> 
    <label for="password"> Password : </label> 
    <input type="password" name="password" value="" id="password"> 
    <input type="hidden" name="category" value="volunteer" id="category"> 
    <input type="submit" value="login" /> 
    </form> 

{% endblock %} 

view.py : 나는 사용자 정의 사용자 클래스를 만들보다는 장고에서 제공하는 기본 User를 사용하여 수 있다고 생각 : 2

def hello(request): 
    name = "abhishek" 
    if request.session.session_key is None: 
     html = '<html><body>Session is expired</body></html>' 
     return HttpResponse(html) 
    try: 
     if not request.POST.get('category') == 'volunteer 
      html = '<html><body>You are Not allowed here</body></html>' 
      return HttpResponse(html) 
    except : 
     print "error" 
    html = '<html><body>Hi this is awesome</body></html>' 
    return HttpResponse(html) 

접근 로그인하는 동안 CustomUser를 request.user에 할당하십시오. 그런 다음 뷰가 호출되면 is_Client 또는 is_Volunteer를 확인합니다.

customUser.py :

from django.db import models 
from django.contrib.auth.models import AbstractBaseUser 

class VolunteerUser(AbstractBaseUser): 
    """ 
    Custom user class. 
    """ 
    email = models.EmailField('email address', unique=True, db_index=True) 
    joined = models.DateTimeField(auto_now_add=True) 
    is_active = models.BooleanField(default=True) 
    is_volunteer = models.BooleanField(default=False) 

class ClientUser(AbstractBaseUser): 
    """ 
    Custom user class. 
    """ 
    email = models.EmailField('email address', unique=True, db_index=True) 
    joined = models.DateTimeField(auto_now_add=True) 
    is_active = models.BooleanField(default=True) 
    is_Client = models.BooleanField(default=False) 

그래서 제 질문중인 작업을 수행하는 가장 좋은 방법은 이러한 접근하는인가? 이 문제를 해결하는 다른 방법이 있습니까?

나는 보안에 대해서도 우려하고 있으며, 첫 번째 방법은 두 번째 방법보다 불안정하다고 생각합니다.

+0

개인적으로 장고의 기본 제공 '그룹'모델을 사용하는 것이 좋습니다. https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.Group –

답변

3

귀하의 요구 사항을 달성하기위한 더 좋은 방법은 Django에서 내장형 GroupPermissions 모델을 사용하는 것입니다.

from django.contrib.auth.decorators import user_passes_test 
@user_passes_test(lambda u: u.get_profile().type == 'client') 
def view_for_client(request):   
    ... 

을 :

from django.contrib.auth.models import User 
class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    type = models.CharField(max_length=15) 

는 다음과 같이 뷰에 대한 액세스를 제어하기위한 @user_passes_test 장식을 사용 Permissions 조금 까다로울 수 있기 때문에하지만, 다른 방법은 다음과 같은 UserProfile 모델을 만드는 것입니다 UserProfile 모델은 사용자의 모든 환경 설정을 저장하는데도 유용합니다. 또한 다음 설정을 지정해야합니다.

AUTH_PROFILE_MODULE = 'accounts.UserProfile' 
관련 문제