Django学习笔记:用户认证与权限控制

1.User

启用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)

2. Group

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()

3.Permission

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

你可能感兴趣的:(python)