权限组件之将登录用户权限写入到session中

Posted c-x-m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了权限组件之将登录用户权限写入到session中相关的知识,希望对你有一定的参考价值。

 

1.登入admin,将销售员的权限改成只能查看订单列表

技术分享图片

 

2.urls.py

 技术分享图片

3.views.py  这样的情况任何人都能访问

技术分享图片

 

思考问题,怎么给页面加权限????

将登录用户权限写入到session中

4.将登入用户权限列表写入到session里面。   session = { "user_id":1, "permission_list":[‘/users/‘, ‘/orders/‘] }

 

 技术分享图片

 

5.访问用户列表、用户订单的时候,去session里面取值  (权限列表) 

判断条件: 只要访问的url 在权限列表里面,则可以访问。

 技术分享图片

 

6.那么问题来了,如果url有正则(\\d+),怎么判断呢???  

 

# current_path = request.path_info  # /users/edit/3

# permission_list = request.session["permission_list"] # [‘/users/‘,‘/orders/‘,‘/users/edit/(\\d+)‘]
# if current_path in permission_list: # 无法判断了
# pass

 

正则匹配

7.match方法

技术分享图片

 

匹配成功的返回值

技术分享图片

 

8.users

技术分享图片

 

 orders  订单也一样的判断

 代码:

 

技术分享图片
from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
from rbac.models import *

def login(request):
    if request.method=="GET":
        return render(request,"login.html")

    else:
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        user=UserInfo.objects.filter(name=user,pwd=pwd).first()
        if user:
            # 验证成功之后做什么?
            request.session["user_id"]=user.pk

            # 当前登录用户的所有权限

            permission_info=user.roles.all().values("permissions__url","permissions__title").distinct()
            temp=[]
            for i in permission_info:
                temp.append(i["permissions__url"])
            request.session["permission_list"]=temp

            #  {"user_id":1,"permission_list":[‘/users/‘,‘/orders/‘]}
            return HttpResponse("登录成功!")
        else:
            return redirect("/login/")


def users(request):

    current_path = request.path_info  # /users/edit/3

    permission_list = request.session.get("permission_list")
    if not permission_list:
        return redirect("/login/")
    # /users/edit/3
    import re
    flag = False
    for permission_url in permission_list:
        ret = re.match(permission_url, current_path)
        if ret:
            flag = True
            break
    if not flag:
        return HttpResponse("没有权限")

    return HttpResponse("用户列表")

def orders(request):

    current_path = request.path_info  # /users/edit/3
    permission_list = request.session.get("permission_list")
    if not permission_list:
        return redirect("/login/")
    # /users/edit/3
    import re
    flag = False
    for permission_url in permission_list:
        ret = re.match(permission_url, current_path)
        if ret:
            flag = True
            break
    if not flag:
        return HttpResponse("没有权限")

    return HttpResponse("订单列表")
Views.py

 

 

 

 

中间件

1.问题:判断代码写到单独的一个文件中,然后中间件中引入。避免太多重复

 技术分享图片

 

2.应该继承什么呢?? 看源码

技术分享图片

 

3.

技术分享图片

 

4.

 技术分享图片

 

5.

技术分享图片

 

6.

技术分享图片

 

7.

代码:

 

技术分享图片
from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import  redirect,HttpResponse,render

class M1(MiddlewareMixin):
    def process_request(self,request):
        pass

        #/admin/login/?next=/admin/
        current_path = request.path_info

        valid_url_menu=["/login/","/reg/","/admin/.*"]
        import re
        for valid_url in valid_url_menu:
            ret=re.match(valid_url,current_path)
            if ret:
                return None

        permission_list = request.session.get("permission_list")
        if not permission_list:
            return redirect("/login/")
        # /users/edit/3
        import re
        flag = False
        for permission_url in permission_list:
            ret = re.match(permission_url, current_path)
            if ret:
                flag = True
                break
        if not flag:
            return HttpResponse("没有权限")
s.py

 

 

8.接下来访问login也没有权限。(加权限的url多,所有应该在中间件s.py文件中定义白订单)

技术分享图片

 

9.

 技术分享图片

 

 

10.admin的路径会自动改变

 技术分享图片

直接跳转

技术分享图片

 

11.白名单路径写死了,应该用正则。

 技术分享图片

 

以上是关于权限组件之将登录用户权限写入到session中的主要内容,如果未能解决你的问题,请参考以下文章

php之将用户信息写入数据库

DjangoRestFramework之认证组件,权限组件,频率组件

权限信息的考题

9. SpringCloud之权限校验方案

JAVA WEB 中登录的session的判断 如何控制用户权限可以访问那些东西

SpringCloud系列之网关gateway-11.权限认证-分布式session替代方案