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_book
、change_book
和 delete_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()