django-auth组件

一.django默认User表,也就是auth_user表的字段

username:用户名
email: 电子邮件
password:密码
first_name:名
last_name:姓
is_active: 是否为活跃用户。默认是True
is_staff: 是否为员工。默认是False
is_superuser: 是否为管理员。默认是False
date_joined: 加入日期。系统自动生成。

二.User库的创建

models.py中创建UserInfo类继承自AbstractUser,会将自带的User表和自定义UserInfo表合并成一张表

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    name = models.CharField(max_length=20)
    tel = models.CharField(max_length=20)

另外settings.py 中配置,之所以这里改是因为要重写django全局settings( from django.conf import global_settings )中的配置文件

AUTH_USER_MODEL = "app01.UserInfo"  #UserInfo所在app.UserInfo

三.django.contrib.auth中的三种方法

1.authenticate()和login()

from django.contrib.auth import authenticate,login,logout
def logins(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        # authenticate用来验证用户,如果账号密码正确,返回一个对象
        user = authenticate(username=username,password=password) 
        if user:
            login(request,user) #账号密码正确后,此处相当于为当前用户设置session
            return redirect("index")
        else:
            return redirect("logins")

2.logout()注销当前用户

def logouts(request):
    logout(request)  #注销当前用户,清除session
    return redirect("index1")

四.认证

1.1request.user.is_authenticated()判断用户是否已经登录

此方法是针对上述login()方法的

def index1(request):
    if request.user.is_authenticated(): 
        返回登录成功界面
    else:
        return HttpResponse("请先登录")

1.2login_required()

用来快捷的给某个视图添加登录校验的装饰器工具

@login_required
def my_view(request):
    pass

如果清除浏览器缓存,如果加了上装饰器会自动跳到 '/accounts/login/'界面,此时解决方式(具体:https://www.cnblogs.com/wodekaifalog/p/10817275.html):

setting.py配置

LOGIN_URL = '/accounts/login/'

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^accounts/login/, views.acc_login),
]

五.权限

这里的权限是用户对于某张表的权限,通过判断用户是否对某张表有权限,进而进行对表的相关对应操作。

https://www.jianshu.com/p/98ef9ca22b12

在定义好models中的表,例如book类,会在auth_permission表中自动生成 permission:add_bookchange_bookdelete_book。auth_permission表中字段解释如下:

content_type 反应了 permission 属于哪个 model(如:Book)
codename 是代码逻辑中检查权限时要用(如:'add_book')
name 是 permission 的描述,将 permission 打印到屏幕或页面时默认显示的就是name(如:Can add book)

1.判断是否拥有权限

1.has_perm()

我们可以用 has_perm() 方法来检验某个用户是否用于某种权限:

from django.contrib.auth.models import User
u = User.objects.get(username='diego')
# has_perm 的 参数格式是: 'app_label.codename'
>>> u.has_perm('myApp.add_book')
True
>>> u.has_perm('myApp.change_book')
True
>>> u.has_perm('myApp.delete_book')
True

2.permission_required

也可以使用装饰器permission_required

from django.contrib.auth.decorators import permission_required

# 图书阅览页面
# 需要有权限 book.read_book 才访问该页面
# 否则跳转到 user_login 页
@ permission_required(perm='book.read_book', login_url="/user_login/")
def read_book(request, id):
    context = {}
    book = Book.objects.get(id=id)
    context['book'] = book
    return render(request, 'read_book.html', context) 

3.Template中使用perms
# 以下内容只对拥有 vote_book  权限的用户显示
{% if perms.myApp.vote_book %}
    <button>打分</button>
{% else %}
    <p>你不能打分</p>
{% endif %}

2.添加权限

# 用户模型、权限模型
from django.contrib.auth.models import User, Permission

u = User.objects.get(username='test_user')

# 通过 codename 找到对应的权限
permission = Permission.objects.get(codename='change_book')

# 把权限赋予给该用户
u.user_permissions.add(permission)

>>> u.has_perm('myApp.change_book')
True

3.权限其他操作

# 设置权限
myuser.user_permissions = [permission_list]

# 设置权限
myuser.user_permissions.set([permission_list])

#增加权限
myuser.user_permissions.add(permission, permission, ...)

#删除权限
myuser.user_permissions.remove(permission, permission, ...) 

#清空权限
myuser.user_permissions.clear()

# 注意:myuser 是一个用户对象,permission 是一个权限对象

4.自定义权限

会在auth_permission生成相应的记录

class Discussion(models.Model):
    a = models.CharField(max_length=20)
    b = models.CharField(max_length=20)

    class Meta:
        permissions = (
            ("open_discussion","Can create a discussion"),
            ("reply_discussion","Can reply a discussion"),
            ("close_discussion","Can close a discussion"),
        )

5.组别

django中有默认表auth_group,用来存储用户组

from django.contrib.auth.models import Group
# 创建一个分组
Group.objects.create(name='reader')

# 获取某用户
u = User.objects.get(username='test_user')

# 获取某分组
g = Group.objects.get(name='reader')

# 把用户加入到分组中
u.groups.add(g)

# 获取某个权限
p= Permission.objects.get(codename='read_book')

# 把该权限加入到分组
g.permissions.add(p)

6.组别其他操作

# 把用户加入分组,group_list可以是一个或多个分组
u.groups = [group_list]

# 把用户加入某分组
u.groups.add(group, group, ...)

# 把某用户从某分组删除
u.groups.remove(group, group, ...)

# 该用户退出所以分组
u.groups.clear()

# 把权限加入到该分组
g.permissions.add(permission, permissions, ...)

# 从该分组删除某权限
g.permissions.remove(permission, permissions, ...)

# 清除该分组所以权限
g.permissions.clear()

六.其他

1.创建用户

from app01 import models
# Create your views here.
def add_user(request):
    models.UserInfo.objects.create_user(username="root",password="root",tel="42314")

2.检查密码是否正确

使用check_password(passwd)来检查密码是否正确,密码正确的话返回True,否则返回False。

ok = user.check_password('密码')

3.修改密码

这里set_password设置的密码为密文

user = User.objects.get(username = ' ' )
user.set_password(password ='')
user.save()

若出现错误:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'EcdsApp.UserProfile'

解决方法:

from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(username=username)
user.set_password(password)
user.save()

参考:https://www.cnblogs.com/wj-1314/p/10065929.html

posted @ 2023-02-26 16:22  MISF  阅读(15)  评论(0编辑  收藏  举报
     JS过度和变形效果演示   
  
    html5.png