django中的自定义用户身份验证如何挂钩

时间:2017-09-25 20:23:00

标签: python django django-rest-framework authorization jwt

所以django docs https://docs.djangoproject.com/en/dev/topics/auth/customizing/很棒,但我很困惑,现在有一位导师会很棒。

我想创建自定义用户模型和身份验证系统

the user model will have 
-name
-password
-email
-JWT (javascript web token) 

权限和场所(娱乐场所)将通过关联表通过多对多关系连接到此用户模型。

这是问题所在,即使是文档,我也很困惑如何覆盖当前的开箱即用实现以进行授权。

此外,我还想使用https://github.com/GetBlimp/django-rest-framework-jwt

用于令牌身份验证,但我不知道如何连接它。我想我正在寻找一个漫步。

2 个答案:

答案 0 :(得分:0)

首先,django有内置的User,为方便起见,你可以使用它,如果你需要将其他字段添加到当前的django用户模型:

form django.contrib.auth.models import User

class MyUser(User):
    # define your additional custom fields

安装djangorestframework-jwt后,在settings.py

中执行此设置
REST_FRAMEWORK = {
    ...
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        ...
    ),
}

JWT_AUTH = {
    # JWT related settings, see the docs
}

在urls.py中添加以下内容:

urlpatterns = [
    ....
    url(r'^api-token-auth/', obtain_jwt_token),
    ...
]

现在您应首先浏览获取令牌,然后浏览其他API:

http://127.0.0.1:8000/api-token-auth/发送帖子请求,并提供用户名和密码以获取您的令牌。 在其他请求中,您应该发送此令牌:

GET http://127.0.0.1:8000/yoururl
HEADER
Authorization JWT <YourToken>

您可以使用curl,httpie,邮递员(Chrome应用)或任何其他HttpClient提出您的请求

答案 1 :(得分:0)

如果要从内置用户中删除字段,则应使用此模型:

from django.core import validators
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.models import UserManager

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(_('username'), max_length=75, unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, numbers and '
                    'underscores characters'),
        validators=[
            validators.RegexValidator(re.compile('^[\w]+$'), 
            _('Enter a valid username.'), 'invalid')
        ])
    first_name = models.CharField(_('first name'), max_length=254, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    email = models.EmailField(_('email address'), max_length = 254, unique = True, null = True)
    is_staff = models.BooleanField(_('staff status'), default=False,
        help_text=_('Designates whether the user can log into this admin '
                    'site.'))
    is_active = models.BooleanField(_('active'), default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['first_name']

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.username

这使您可以完全自定义用户模型。您可以删除相应的字段。然后按照设置djangorestframework-jwt。

的说明进行操作