【问题标题】:User Authentication in Django REST FrameworkDjango REST 框架中的用户身份验证
【发布时间】:2018-02-12 10:15:15
【问题描述】:

我有一个 Django REST 后端,它有一个 /users 端点,我可以通过前端的 POST 方法添加新用户。

/users端点网址:

http://192.168.201.211:8024/users/

在这个端点我可以查看所有用户信息并添加新用户,所以我必须避免除管理员之外的其他人进入它。我创建了一个超级用户admin,密码为admin123python manage.py createsuperuser

我的问题是,如果我想从前端执行 HTTP POST(我使用 Angular),我必须传递管理员的用户名和密码 adminadmin123,以及 POST 头部信息.所以我让其他人知道查看前端源代码的用户名和密码。

有没有其他方法可以做到这一点Authentication 而不会将管理员的用户名和密码暴露给其他人?

【问题讨论】:

  • 为什么要将管理员的凭据硬编码到前端?
  • 如果新用户想代替Administrator注册,该如何处理?

标签: django angular rest


【解决方案1】:

您需要创建一个处理用户创建的 API。这就是我们创建后端的原因。用户将向 API 发送他们的凭据,API 将使用管理员凭据和发布请求将用户添加到数据库中。 API 的代码将不可见。根据您的需要,auth0 可能是一个很好的解决方案,可以为您节省用户注册和登录的时间。如果您自己注册并登录,请务必对密码进行哈希处理并确保它们是通过 SSL 发送的。如果您想专注于项目的其他部分,像 auth0 这样的服务将为您处理所有这些。

【讨论】:

  • 你的意思是我需要创建另一个端点而不是http://192.168.201.211:8024/users/?喜欢/create_user/,然后手动添加新用户到db,不要使用django REST ModelViewSet添加使用。
  • 假设 /create_user/ 接收到发布请求,然后获取该数据并发布到 django REST ModelViewSet 以添加用户。
  • 我们如何在Django的view函数中实现POST?我的意思是POST 总是从前端到后端,对吧?
【解决方案2】:

token auth 可能是您需要的,我使用令牌身份验证作为 DRF 作为后端,使用角度作为前端

【讨论】:

  • 我可以用token = Token.objects.create(user='admin')得到一个admin的token,然后用这个token做一个POST吧?
  • 用户登录成功需要返回一个token给用户客户端,在此之后,所有来自客户端的请求都需要添加一个头格式如'Authorization':'Token 7582b1089cb8fd605d03fe70bcd0ee7c2f7cxf14',然后TokenAuthentication将识别用户后端标头的身份
  • 如果您是 DRF 和令牌认证的新手,django-rest-framework-jwt 一定有帮助
  • 我知道jwt,如果我用admin 和相关密码登录,那么我可以得到一个令牌。但在这里,我想通过新用户访问/users/ 端点,而不是admin。这个新用户没有admin的密码。
  • 我想授予此用户访问此端点的临时权限
【解决方案3】:

终于找到了解决这个问题的方法。

这里有一个非常优雅的方法,在我的 UserViewSet 中重写get_queryset 函数:

class UserViewSet(viewsets.ModelViewSet):

    # permission_classes = (permissions.IsAdminUser, )
    permission_classes = (permissions.AllowAny, )  # <-- change 1
    # queryset = User.objects.all()  # <-- change 2
    serializer_class = UserSerializer

    def get_queryset(self):
        queryset = User.objects.filter(id=self.request.user.id)
        if self.request.user.is_superuser:
            queryset = User.objects.all()
        return queryset

在更改 1 中,权限允许任何人访问,因此新用户无需任何身份验证即可执行 POST

在更改 2 中,我只在用户是超级用户时返回所有用户,就像重写 get_queryset 完成一样。

还需要更改urls.py 文件来为这个url 添加base_name,如下所示:

router.register(r'users', UserViewSet, base_name='user')

参考,https://stackoverflow.com/a/22767325/2803344

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 2017-09-26
    • 2017-11-02
    • 2021-06-05
    • 1970-01-01
    • 2019-03-01
    • 2021-12-21
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多