Django 13 admin和auth系统、权限问题
一、auth系统
auth系统的数据表
#User:User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user. #Group:User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象可以通过user_set反向查询用户组中的用户。 #Permission:Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。
User模型常用属性和方法
username #用户名 email #邮箱 groups #多对多的组 user_permissions #多对多的用户权限 is_staff #是否是admin的管理员 is_active #是否激活,判断该用户是否可用 is_superuser #是否是超级用户 last_login #上次登录时间 dete_joined #注册时间 is_authenticated #是否验证通过了 is_anonymous #是否是匿名用户 set_password(raw_password) #设置密码,传原生密码进去 check_password(raw_password) #检查密码 has_perm(perm) #判断用户是否有某个权限 has_perm(perm_list) #判断用户是否有权限列表中的某个列表
auth认证系统的功能
create_user #创建用户 authenticate #验证登录 login #记住用户的登录状态 logout #退出登录 is_authenticated #判断用户是否登录 login_required #判断用户是否登录的装饰器
运用auth系统
from django.shortcuts import render,reverse,redirect from .forms import RegisterForm,LoginForm from .models import UserModel # Create your views here. from django.contrib.auth.models import User,Permission,Group #从auth系统导入User,Permission,Group 表 from django.contrib.auth import login,logout,authenticate #导入login,logout,authenticate三个方法 def home(request): return render(request,'login/home.html') def register(request): if request.method == 'GET': return render(request,'login/register.html') if request.method == 'POST': form = RegisterForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') password_repeat = form.cleaned_data.get('password_repeat') email = form.cleaned_data.get('email') if password == password_repeat: # UserModel.objects.create(username = username,password = password,email = email) User.objects.create_user(username=username,password=password,email=email) #用create_user自动给密码加密 return redirect(reverse('login_login')) else: return redirect(reverse('login_register')) return redirect(reverse('login_register')) return redirect(reverse('login_register')) def login_view(request): if request.method == 'GET': return render(request,'login/login.html') if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') # user = UserModel.objects.filter(username=username,password=password) user = authenticate(username=username,password=password) #自动验证数据库是否有该用户,自动密码解密 if user: # request.session['username'] = username login(request,user) #这种方式实现登录状态 return redirect(reverse('login_home')) else: return redirect(reverse('login_register')) return redirect(reverse('login_register')) else: return redirect(reverse('login_register')) def logout_view(request): # request.session.flush() logout(request) #这种方式实现退出用户 return render(request,'login/login.html')
二、设置blog主页的登录权限
为了实现在进入博客页面之前必须得登录(就是设置登录权限)
#1、setting.py最后添加 LOGIN_URL = '/login/login' #把这个页面设置成登录页面,只要没登录就会跳转这个页面 #2、在想要设置权限的地方加上装饰器,在blog的app主页里面添加 from django.contrib.auth.decorators import login_required,permission_required @login_required #实现登录权限;想要进入这个页面,如果没有登录,就会跳转到默认登录页面 def index(request): ''' 主页 ''' return render(request,'blog/demo_index.html') #3、为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url,在保持用户登录状态之后添加代码 if user: # request.session['username'] = username login(request,user) #这种方式实现登录状态 next_url = request.GET.get('next') #为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url if next_url: #如果存在,跳转到该url return redirect(next_url) return redirect(reverse('login_home'))
三、关于权限
#在auth系统当中,django已经为我们提供了一个用户身份验证,用户组和权限管理这些功能, 那么就可以使用它来完善我们现有的这个项目.
修改用户密码
def test(request): xcc = User.objects.filter(username='xuchengcheng').first() xcc.set_password('qwe123') #修改密码 xcc.save() return HttpResponse(111111)
设置添加博客权限
@permission_required('blog.add_blogmodel') #设置app名blog下的add_blogmodel权限,用户必须有这个权限才能添加博客 def add(request): ''' 添加页 ''' pass
添加权限方式
def test(request): #给小明一个添加博客的权限 xiaoming = User.objects.filter(username='xiaoming').first() #获取用户 add_blog_permission = Permission.objects.filter(codename='add_blog').first() #获取权限 xiaoming.user_permissions.add(add_blog_permission) #给用户添加权限 #给组增加一个添加博客的权限,将用户放入这个组里面就可以实现添加博客权限 g1 = Group() g1.name = 'add_blog_permission' #设置组 g1.save() g1.permissions.add(add_blog_permission) #给组添加权限 g1 = Group.objects.filter(name='add_blog_permission') xiaohong = User.objects.filter(username='xiaohong').first() print(xiaohong) g1.user_set.add(xiaohong) #将小红添加到这个组 return HttpResponse(111111)