启用auth后的User表:
如何启用auth?在settings.py 文件里,在INSTALLED_APPS中添加’django.contrib.auth’使用该APP, auth模块默认启用。
CREATE TABLE "auth_user" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"password" varchar(128) NOT NULL, "last_login" datetime NULL,
"is_superuser" bool NOT NULL,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL,
"email" varchar(254) NOT NULL,
"is_staff" bool NOT NULL,
"is_active" bool NOT NULL,
"date_joined" datetime NOT NULL,
"username" varchar(30) NOT NULL UNIQUE
)
User模型与我们自定义的模型一样,同样是继承了django.db.models.Model,所以API也几乎一样,导入User
from django.contrib.auth.models import User
创建用户
user = User.objects.create_user(username, email, password)
user.save()
修改密码
user.set_password(new_password)
认证
需要用到authenticate方法。
from django.contrib.auth import authenticate
若用户名密码有效返回user对象,无效返回None,注意,不会检查is_active标志位
user = authenticate(username=username, password=password)
登录
需要导入login
from django.contrib.auth import login
login,添加session
login(request, user)
该方法和authenticate一样,不会检查is_active,通常和authenticate一起使用:
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
退出登录
导入logout
from django.contrib.auth import logout
logout会移除request中的user信息, 并刷新session:
logout(request)
Group只有id和name两个字段。和User是多对多的关系。
导入Group
django.contrib.auth.models.Group
添加、删除用户组
# 添加用户组
group = Group.objects.create(name=group_name)
group.save()
# 删除用户组
group.delete()
用户加入和退出用户组
#用户加入用户组
user.groups.add(group)
#或者
group.user_set.add(user)
#用户退出用户组
user.groups.remove(group)
#或者
group.user_set.remove(user)
#用户退出所有用户组
user.groups.clear()
#用户组中所有用户退出组
group.user_set.clear()
django的auth默认提供了模型级的权限控制,针对模型(数据表)进行增删改查。如果要对象级的权限控制,可以使用django-guardian
。
默认每个模型有增删改的权限可供直接使用,在admin site 中新增组或用户,可以看到授权模块:
catalog | book | can add book
catalog | book | can change book
catalog | book | can delete book
也可以在模型中自定义权限,方法是,在名为Meta的内部类中,给类属性permissions赋一个二维元祖,每一维都是一项权限,第一个值是权限名(我们在代码中直接使用的),第二个相当于是说明。
class BookInstance(models.Model):
...
class Meta:
permissions = (('can_mark_returned', 'Set book as returned'),)
修改了模型之后,记得makemigrations和migrate。于是,在admin site 中已经可以看到我们自定义的权限。
catalog | bookinstance | Set book as returned
检查用户权限
user.has_perm
方法用于检查用户是否拥有操作某个模型的权限:
user.has_perm('book.add_book')
user.has_perm('book.change_book')
user.has_perm('blog.delete_book')
@permission_required
装饰器或PermissionRequiredMixin
可以替代has_perm,并在用户没有相应权限时重定向到登录页或者抛出异常。
# 视图函数用装饰器
# permission_required(perm[, login_url=None, raise_exception=False])
from django.contrb.auth.decorators import permission_required
@permission_required('book.add_book')
def add_book(request):
pass
# 视图类继承Mixin,注意顺序,Mixin放第一个。
from django.contrib.auth.mixins import PermissionRequiredMixin
class LoanedBooksListView(PermissionRequiredMixin, generic.ListView):
...
permission_required = 'catalog.can_mark_returned'
如果只是要求用户登录,可以用@login_required
装饰器或LoginRequiredMixin
(不用再指定类属性了)
管理用户权限
可以在admin site 将权限配置给用户或用户组,也可以用代码实现:
User和Permission通过多对多字段user.user_permissions关联。
#添加权限
user.user_permissions.add(permission)
#删除权限:
user.user_permissions.delete(permission)
#清空权限:
user.user_permissions.clear()
用户自动拥有其用户组的权限,Group和Permission通过多对多字段group.group_permissions关联。
#添加权限:
group.permissions.add(permission)
#删除权限:
group.permissions.delete(permission)
#清空权限:
group.permissions.clear()
参考:https://www.cnblogs.com/ccorz/p/6358074.html