简介
默认情况下,所有用户都能访问API。
首先,通过在urls.py
中引入rest_framework.urls
并设置api/auth/
路由以实现登录和注销功能。
其次,为PostList
和PostDetail
视图添加permissions.IsAuthenticated
,确保只有认证的用户才能访问。
这使得未认证用户收到403错误。
1 查看和编辑权限 Permissions
权限和安全性是任何网站的重要组成部分,但对于Web API而言则至关重要。
现在rest_framework 有out-of-the-box 权限可以应用于项目水平,视图层 或 个人模型 ( project-level, a view-level,individual model level.)
创建一个用户,并赋予它不同权限。
在 127.0.0.1:2000/admin/ 添加一个用户(user) 用户名/密码: testuser/user.123 其他不做操作,保存后转跳至用户列表。
今后,无论何时我们想在用户帐户之间切换时,都需要跳到Django管理员,退出一个帐户,然后登录另一个帐户。每次。然后切换回到我们的API端点。
Django REST Framework具有单行设置来添加登录并直接注销到可操作的API。
在项目级别的urls.py文件中,添加一个包含rest_framework.urls的新URL路由。使用 api/auth 匹配,只有登录后认证的用户可以查看。
# config/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/', include('posts.urls')),
path('api/auth/', include('rest_framework.urls')),
]
访问 <http://127.0.0.1:8000/api/v1/
上的可浏览API。有一个细微的变化:右上角的用户名旁边点击可以发现> logout 登出按钮。
登出后 被重定向到Django REST Framework的登录页面,使用新用户 testuser登录。
登录后可以发现,所有api都没有进行权限限制,可以被任何人使用。 即使登出testuser 也一样。 任何用户都可以查看删除修改文章。
2 项目级别授权
这是因为 “发布列表”端点以及“详细列表”端点,是我们之前在config/settings.py中将项目的项目级别权限设置为AllowAny。
我们可以在多个层次操作权限
this—project-level, view-level, object-level—but
视图权限 这里有两个视图,让我们为它们都添加权限。
from rest_framework import generics, permissions #权限
每个视图类都增加权限属性。 只有登录后认证的用户可以查看
class PostList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
...
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (permissions.IsAuthenticated,)
...
刷新可浏览的API,网址为http://127.0.0.1:8000/api/v1/。看看发生了什么,此时后台将返回 403 拒绝消息
HTTP 403 Forbidden
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"detail": "Authentication credentials were not provided."
}
向每个视图添加专用的Permission_classes如果要在整个API上设置相同的权限设置,则重复此操作。最好一次更改我们的权限(最好是在项目级别)。
3 小结
在项目级别设置严格的权限策略,并根据需要在视图级别放宽策略。这就是我们要做的。
REST_Framework随附了许多内置的项目权限管理级别,我们将继续探索。