2

我有这样的自定义用户模式:Django的REST框架不验证自定义用户模型

class CustomUser(AbstractBaseUser,PermissionsMixin): 
    email = models.CharField(max_length=255, unique=True) 
    .... 

这种观点是supossed需要身份验证才能运行:

@authentication_classes((TokenAuthentication,)) 
@permission_classes((IsAuthenticated,)) 
def test_view(request): 
    return HttpResponse("Allowed") 

当我启动网址为此,它将始终运行,无论我是否在我的授权标头中提供凭证。我的猜测是rest框架使用django的默认用户模型,因为request.user对象包含一个AnonymousUser实例。但是我检查了数据库,并且authtoken表引用了我的自定义用户表。

我认为这应该和我的代码一样简单,但我想我错过了一些东西。有任何想法吗?

编辑:这里有更多的细节:

settings.py:

INSTALLED_APPS = (
    'myapps', 
    ... 
    'django.contrib.auth', #should this be enabled? 
    ... 
    'rest_framework.authtoken' 
) 
... 
#I think this is unnecesary since i use per-view decorators, but... 
REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

AUTH_USER_MODEL = 'users.CustomUser' 

urls.py:

urlpatterns = patterns('', 
    ... 
    url(r'^test', test_view, name='test'), 
    ... 
) 
+0

有你在您的settings.py文件中将'AUTH_USER_MODEL'设置为您的自定义用户模型?并且还会显示您正在尝试请求的“urls”和网址。 –

+0

Anush是我的AUTH_USER_MODEL已设置。我添加了url文件和一些其他设置。 –

回答

1

只需添加@api_view(['GET'])装饰你的看法一样

from rest_framework.decorators import api_view 

@api_view(['GET']) 
@authentication_classes((TokenAuthentication,)) 
@permission_classes((IsAuthenticated,)) 
def test_view(request): 
    return HttpResponse("Allowed") 
+0

是的,这工作。不知道api_view是其他装饰器工作所需的。谢谢! –

0

添加以下的settings.py

如果您正在使用DRF令牌验证:

INSTALLED_APPS = (
    ... 
    'rest_framework.authtoken' 
) 

如果您使用JWT验证:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 
    ), 
    ... 
} 
+0

谢谢Serjik,但rest_framework.authtoken已经在我安装的应用程序中。而且我甚至不知道什么是jwt,所以我想我不会使用它。我在我的问题中添加了更多细节。 –

+0

JWT = JSON Web令牌认证,https://github.com/GetBlimp/django-rest-framework-jwt,我建议尝试,这是我对项目的主要认证 – Serjik

+0

看起来有趣,我会试试看。谢谢! –