csrf装饰器、中间件思想、auth认证模块、bbs项目分析

csrf装饰器、中间件思想、auth认证模块、bbs项目分析



csrf相关装饰器

1、什么是csrf: 跨站请求伪造Cross Site Request Forgery

2、举例子:什么是跨站请求攻击:用户a 访问可信站点1做业务处理,此时浏览器会保存该网站的cookie,当用户a 访问不可信站点2时,如果站点2有指向站点1的链接时候,那么攻击就用可能发生

3、Django怎么做的:使用了csrf的中间件,具体操作是这样的,当浏览器第一次和Django服务交互的时候,后台会生成一个唯一标识码, 放入到前端,同时后台也保存,那么之后再提交数据 服务端就会做csrf的校验,如果通过那么就正常处理,否则返回403

基于这个中间件,我们可以通过以下操作来使用或关闭它


如果使用开启csrf校验需要先注释掉中间件中的/此操作代表全局不在使用csrf检测
'django.middleware.csrf.CsrfViewMiddleware'

@csrf_protect  # 开启csrf校验
@csrf_exempt  # 忽略csrf校验
# 针对FBV
@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')
  
# 针对CBV
csrf_protect 三种CBV添加装饰器的方式都可以
csrf_exempt  只有一种方式可以生效(给重写的dispatch方法装)

基于中间件思想编写项目


conformity 整合文件夹

settings.py 功能字典
# 拼接对应功能的地址
NOTIFY_FUNC_LIST = [
    'func.NO1.No1',
    'func.NO2.No2',
    'func.NO3.No3'
]

start.py 启动函数
import func

if __name__ == '__main__':
    func.recommend('百尺竿头更进一步')  # 调用并传参

func 对应功能文件夹

__init__.py  

from conformity import settings
import importlib


def recommend(talk):  # 启动文件调用该方法
    for i in settings.NOTIFY_FUNC_LIST:  # 循环拿出功能字典
        pypath, funcpath = i.rsplit('.', maxsplit=1)  # 切割
        module = importlib.import_module(pypath)  # 导入模块
        func_name = getattr(module, funcpath)  # 反射拿出类
        obj = func_name()  # 类加括号实例化
        obj.intro(talk)  # 调用鸭子方法,方法之前的操作各自写入__init__
        
 class No%s(object):  # 传统继承新式类
    def __init__(self):
        print('%s的专属消息')

    def intro(self, talk):
        print('我是%s', talk)
        
启动:
no1的专属消息
我是no1 百尺竿头更进一步
no2的专属消息
我是no2 百尺竿头更进一步
no3的专属消息
我是no3 百尺竿头更进一步

如果我想卸载掉no2功能,那么我只需要去在配置文件的功能字典中
# 'func.NO2.No2',

以上编写代码的优点体现于拼接性好,增加功能和移除功能方便

我们只需要对settings.py下的NOTIFY_FUNC_LIST 做增加或删除就可以控制后续功能组件的增加或减少


auth认证模块


我们之前一直练习的登录注册功能······在这一刻

django自带了一个用户登录注册管理系统,该系统相对较为完整

# django提供给你快速完成用户相关功能的模块
	用户相关功能:创建、认证、编辑...
# django也配套提供了一张'用户表'
	执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
	创建admin后台管理员用户:run manage.py task>>:createsuperuser
  自动对用户密码进行加密处理并保存

auth模块方法大全


1、authenticate() 身份认证

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

user = authenticate(username='theuser',password='thepassword')

2、login(HttpRequest, user) 登录

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

from django.contrib.auth import authenticate, login

def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user_obj = authenticate(username=username, password=password)  # 与数据库做判断
  if user_obj:
    login(request, user_obj)
		# 成功
   	render(requset,'xx.html')  # 返回到登录后页面
  else:
		# 失败
注意:只要使用login(request, user_obj)之后,request.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。

3、logout(request) 登出

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

from django.contrib.auth import logout

def logout_view(request):
  logout(request)

4、is_authenticated() 判断登录状态

用来判断当前请求是否通过了认证。

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

5、login_requierd() 装饰器,类似于登录状态确认

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
  
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由

6、create_user() 创建新用户

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

普通用户只有username和password必须要

7、create_superuser() 创建超级用户(管理员)

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

超级用户除了username和password以外email也必须要

8、check_password(raw_password) 校验密码

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

ok = user_obj.check_password('密码')
或者直接针对当前请求的user对象校验原密码是否正确:

ok = request.user.check_password(raw_password='原密码')

9、set_password(raw_password) 修改密码

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法

user_obj.set_password('新密码')
user_obj.save()

auth扩展表字段


​ 虽然django自带的登录注册功能已经很多字段了,但是相当于项目使用远远不够;所以我们就来学习一下怎么扩展表的字段

类继承:

from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写需要扩展的字段,不可冲突之前的字段
    # 必须是全空的,最好新建一个库直接继承
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

AUTH_USER_MODEL = 'app01.Users'  # 配置字典中添加
继承AbstractUser之后,上述的所有操作方法都可以在新的模型类中使用

注意:类继承后,需要重新执行数据库迁移命令,并且是这个库里面的第一次操作才可以。


bbs数据表分析




感谢观看!

posted @ 2022-05-25 17:03  Eason辰  阅读(114)  评论(0)    收藏  举报