码迷,mamicode.com
首页 > 其他好文 > 详细

Djiango权限组件

时间:2019-10-21 09:53:41      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:view   pen   path_info   int   temp   tin   mixin   pat   char   

一. login中注册 权限url

def login(request):
    if request.method == "POST":

        username = request.POST.get("username")
        pwd = request.POST.get("password")
        user = models.User.objects.filter(name=username, pwd=pwd).first()
        # print(user,"mmmmmmmmmmmmmmmmmmmmm")   # riven
        if user:
            # 在session中注册用户id############################################
            request.session["user_id"] = user.pk
            # 在session注册权限列表
            # 查询当前登录用户的所有权限
            # < QuerySet[{‘title‘: ‘CEO‘, ‘permissions__url‘: ‘"/users/"‘}
            # 调用函数登录封装设置url路径的session函数
            initial_session(user, request)
            """
            valures 查询原理
            values:
            temp=[]
            for role in user.roles.all():  # [<Role: 保洁>,<Role: 销售>]
                temp.append({
                    "title": role.title,
                    "permissions__url":role.permissions.all(),

                })    
            """
            return redirect("/users/")
    return render(request, "login.html", locals())
# 调用函数登录封装设置url路径的session函数
# 调用函数登录封装设置url路径的session函数
def initial_session(user, request):
    """

    :param user: 当前登录用户
    :param request: 就是request呀
    :return: 返回
    """
    permission = user.roles.all().values("permissions__url").distinct()  # distinct() 去重的意思
    permission_list = []

    # 循环queryset取值
    for item in permission:
        permission_list.append(item["permissions__url"])  # [‘"/users/"‘, ‘"/users/add/"‘, ‘"/roles/"‘]

    # 将用户权限 注册到session当中####################################
    request.session["permission_list"] = permission_list

二 . 在中间件中校验权限

import re
from django.shortcuts import render, redirect, HttpResponse
# 使用中间键来做权限校验
from django.utils.deprecation import MiddlewareMixin
class ValidPermission(MiddlewareMixin):

    def process_request(self, request):
        # 当前访问路径
        cerrent_path = request.path_info  # /users/add/

        # 因为下面操作限制了 login 的进去 尴尬一批所以定义了白名单
        valid_url_list = ["/login/", "/reg/", "/admin/.*"]
        for valid_url in valid_url_list:
            valid_url = "^%s$" % valid_url  # ^/users/$
            ret = re.match(valid_url, cerrent_path)
            if ret:
                return None

        # 校验是否登录
        user_id = request.session.get("user_id")
        if not user_id:
            return redirect("/login/")

        # 校验权限
        # [‘/users/‘, ‘/users/add/‘, ‘/roles/‘, ‘/users/delete/(\\d+)/‘, ‘/users/edit/(\\d+)/‘]
        permission_list = request.session.get("permission_list", []) # 取值 取不到就返回一个空列表

        flag = False
        for permission in permission_list:
            permission = "^%s$" % permission  # ^/users/$
            ret = re.match(permission, cerrent_path)
            if ret:
                flag = True
                break

        if not flag:
            return HttpResponse("没有访问权限")

        return None

参考代码:

技术图片

 

 

 

from
from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    re_path(r^admin/, admin.site.urls),
    re_path(r^users/$, views.users),
    re_path(r^roles/$, views.roles),
    re_path(r^login/$, views.login),
    re_path(r^add_users/$, views.add_users),
    re_path(r^delete_users/(\d+)/$, views.delete_users),
    re_path(r^edeit_users/(\d+)/$, views.edeit_users),
    re_path(r^add_roles/$, views.add_roles),
    re_path(r^delete_roles/(\d+)/$, views.delete_roles),
    re_path(r^edeit_roles/(\d+)/$, views.edeit_roles),
]

 

 django.db import models


# Create your models here.


# 用户表
class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    roles = models.ManyToManyField(to="Role")

    def __str__(self):
        return self.name


# 角色表
class Role(models.Model):
    title = models.CharField(max_length=32)
    permissions=models.ManyToManyField(to="Permission")

    def __str__(self):
        return self.title


# 权限表
class Permission(models.Model):
    title = models.CharField(max_length=32)
    url = models.CharField(max_length=32)

    def __str__(self):
        return self.title

技术图片

 

 

 

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    re_path(r^admin/, admin.site.urls),
    re_path(r^users/$, views.users),
    re_path(r^roles/$, views.roles),
    re_path(r^login/$, views.login),
    re_path(r^add_users/$, views.add_users),
    re_path(r^delete_users/(\d+)/$, views.delete_users),
    re_path(r^edeit_users/(\d+)/$, views.edeit_users),
    re_path(r^add_roles/$, views.add_roles),
    re_path(r^delete_roles/(\d+)/$, views.delete_roles),
    re_path(r^edeit_roles/(\d+)/$, views.edeit_roles),
]

技术图片

 

 

 

# 调用函数登录封装设置url路径的session函数
def initial_session(user, request):
    """

    :param user: 当前登录用户
    :param request: 就是request呀
    :return: 返回
    """
    permission = user.roles.all().values("permissions__url").distinct()  # distinct() 去重的意思
    permission_list = []

    # 循环queryset取值
    for item in permission:
        permission_list.append(item["permissions__url"])  # [‘"/users/"‘, ‘"/users/add/"‘, ‘"/roles/"‘]

    # 将用户权限 注册到session当中####################################
    request.session["permission_list"] = permission_list

技术图片

 

 

 

import re
from django.shortcuts import render, redirect, HttpResponse
# 使用中间键来做权限校验
from django.utils.deprecation import MiddlewareMixin
class ValidPermission(MiddlewareMixin):

    def process_request(self, request):
        # 当前访问路径
        cerrent_path = request.path_info  # /users/add/

        # 因为下面操作限制了 login 的进去 尴尬一批所以定义了白名单
        valid_url_list = ["/login/", "/reg/", "/admin/.*"]
        for valid_url in valid_url_list:
            valid_url = "^%s$" % valid_url  # ^/users/$
            ret = re.match(valid_url, cerrent_path)
            if ret:
                return None

        # 校验是否登录
        user_id = request.session.get("user_id")
        if not user_id:
            return redirect("/login/")

        # 校验权限
        # [‘/users/‘, ‘/users/add/‘, ‘/roles/‘, ‘/users/delete/(\\d+)/‘, ‘/users/edit/(\\d+)/‘]
        permission_list = request.session.get("permission_list", []) # 取值 取不到就返回一个空列表

        flag = False
        for permission in permission_list:
            permission = "^%s$" % permission  # ^/users/$
            ret = re.match(permission, cerrent_path)
            if ret:
                flag = True
                break

        if not flag:
            return HttpResponse("没有访问权限")

        return None

技术图片

 

 

 

from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth
# Create your views here.
from app01 import models
import re
from rbac_config.service.perssions import *


def login(request):
    if request.method == "POST":

        username = request.POST.get("username")
        pwd = request.POST.get("password")
        # 利用auth模块做用户名和密码的校验
        user = models.User.objects.filter(name=username, pwd=pwd).first()
        # print(user,"mmmmmmmmmmmmmmmmmmmmm")   # riven
        if user:
            # 在session中注册用户id############################################
            request.session["user_id"] = user.pk
            # 在session注册权限列表
            # 查询当前登录用户的所有权限
            # < QuerySet[{‘title‘: ‘CEO‘, ‘permissions__url‘: ‘"/users/"‘}
            # 调用函数登录封装设置url路径的session函数
            initial_session(user, request)
            """
            valures 查询原理
            values:
            temp=[]
            for role in user.roles.all():  # [<Role: 保洁>,<Role: 销售>]
                temp.append({
                    "title": role.title,
                    "permissions__url":role.permissions.all(),

                })    
            """
            return redirect("/users/")
    return render(request, "login.html", locals())


def users(request):
    user_list = models.User.objects.all()
    active1 = active
    permission = request.session.get("permission_list", [])

    ret = False

    for i in permission:
        if (/delete_roles/(\\d+)/) == i:
            ret = True

        if (/edeit_roles/(\\d+)/) == i:
            ret = True

    return render(request, "user.html", locals())


def add_users(request):
    if request.method == "POST":
        user_id = request.POST.getlist("add_user")
        text_users = request.POST.get("text_users")
        text_pwd = request.POST.get("text_pwd")
        new_id = models.User.objects.create(name=text_users, pwd=text_pwd)
        new_id.roles.add(*user_id)  # 多对多字段添加方法
        return redirect("/users/")
    add_obj = models.Role.objects.all()
    return render(request, "add_users.html", locals())


def delete_users(request, id):
    models.User.objects.filter(id=id).delete()
    return redirect("/users/")


def edeit_users(request, id):
    if request.method == "POST":
        user_id = request.POST.getlist("add_user")
        text_users = request.POST.get("text_users")
        text_pwd = request.POST.get("text_pwd")
        update_obj = models.User.objects.get(id=id)
        update_obj.name = text_users
        update_obj.pwd = text_pwd
        # 多对多用set
        update_obj.roles.set(user_id)
        update_obj.save()
        return redirect("/users/")

    user_text = models.User.objects.filter(id=id)
    roles_list = user_text.values_list("roles__id")
    roles_list_new = []
    for i in roles_list:
        roles_list_new.append(i[0])
    role_list = models.Role.objects.all()
    id = id
    return render(request, "edeit_users.html", locals())


def roles(request):
    roles_list = models.Role.objects.all()
    active2 = active
    permission_roles = request.session.get("permission_list", [])

    ret = False

    for i in permission_roles:
        if (/delete_roles/(\\d+)/) == i:
            ret = True

        if (/edeit_roles/(\\d+)/) == i:
            ret = True

    return render(request, "roles.html", locals())


def add_roles(request):
    if request.method == "POST":
        print(request.POST)
        text_roles = request.POST.get("text_roles")
        add_permission = request.POST.getlist("add_permission")
        roles_obj = models.Role.objects.create(title=text_roles)
        roles_obj.permissions.add(*add_permission)
        return redirect("/roles/")
    permission_obj = models.Permission.objects.all()
    return render(request, "add_roles.html", locals())


def delete_roles(request, id):
    models.Role.objects.filter(id=id).delete()
    return redirect("/roles/")


def edeit_roles(request, id):
    if request.method == "POST":
        text_roles = request.POST.get("text_roles")
        add_permission = request.POST.getlist("add_permission")
        new_roles = models.Role.objects.get(id=id)
        new_roles.title = text_roles
        new_roles.permissions.set(add_permission)  # set时不需要打散
        new_roles.save()
        return redirect("/roles/")

    role_obj = models.Role.objects.all()
    permission = models.Permission.objects.all()
    role_obj_title = role_obj.filter(id=id)
    permission_list = []
    roles_obj_id = models.Role.objects.filter(id=id).values_list("permissions")
    for ret in roles_obj_id:
        permission_list.append(ret[0])
    id = id
    return render(request, "edeit_roles.html", locals())

技术图片

 

 

 

{% extends "base.html" %}


{% block con %}
    <form action="/add_roles/" method="post">
        {% csrf_token %}
        <div>
            <p>角色<input type="text" name="text_roles"></p>
        </div>

        <div>
            <select name="add_permission" multiple>
                {% for url in permission_obj %}
                    <option value="{{ url.id }}">{{ url }}</option>
                {% endfor %}
            </select>
        </div>
        <button type="submit" class="btn btn-primary">提交</button>

    </form>


{% endblock %}

技术图片

 

 

 

{% extends "base.html" %}



{% block con %}
<form action="/add_users/" method="post">
{% csrf_token %}
<p>用户名<input type="text" name="text_users"></p>
<p>密码<input type="password" name="text_pwd"></p>
<div>
<select name="add_user" multiple>
{% for add_user in add_obj %}
<option value="{{ add_user.id }}">{{ add_user }}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="btn btn-primary">提交</button>

</form>
{% endblock %}

技术图片

 

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--配置手机端适应-->
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <!--配置css文件 核心CSS样式压缩文件-->
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.css">
    <!--配置jQuery-->
    <script src="/static/bootstrap/jQuery.js"></script>
    <!--配置 核心Boot script JS压缩文件-->
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
    <style>
        .header {
            width: 100%;
            height: 60px;
            background-color: #336699;
        }

        .menu {
            background-color: bisque;
            position: fixed;
            top: 60px;
            bottom: 0px;
            left: 0px;
            width: 200px;
        }

        .content {
            position: fixed;
            top: 60px;
            bottom: 0;
            right: 0;
            left: 200px;
            padding: 30px;
        }
    </style>
</head>
<body>


<div class="header"></div>
<div class="container">
    <div class="row">
        <div class="menu col-md-3">
            {% if "/users/" in permission or permission_roles %}
            <a href="/users/" class="list-group-item {{ active1 }}">User_List</a>
            {% endif %}
            {% if "/roles/" in permission or permission_roles %}
            <a href="/roles/" class="list-group-item {{ active2 }}">Roles_list</a>
            {% endif %}
            <div class="content col-md-8">
                {% block con %}
                {% endblock %}
            </div>

        </div>
    </div>


</body>
</html>

技术图片

 

 

 

{% extends "base.html" %}

{% block con %}
    <form action="/edeit_roles/{{ id }}/" method="post">
        {% csrf_token %}
        <div>
            <p>角色<input type="text" name="text_roles" value="{{ role_obj_title.0 }}"></p>
        </div>

        <div>
            <select name="add_permission" multiple>
                {% for url in permission %}
                    {% if url.id in permission_list %}
                        <option selected value="{{ url.id }}">{{ url }}</option>
                    {% else %}
                        <option value="{{ url.id }}">{{ url }}</option>
                    {% endif %}

                {% endfor %}
            </select>
        </div>
        <button type="submit" class="btn btn-primary">提交</button>
    </form>
{% endblock %}

技术图片

 

 

 

{% extends "base.html" %}



{% block con %}

    <form action="/edeit_users/{{ id }}/" method="post">
    {% csrf_token %}
    <p>用户名<input type="text" name="text_users" value="{{ user_text.0 }}"></p>
    <p>密码<input type="password" name="text_pwd"></p>
    <div>
        <select name="add_user" multiple >
            {% for add_user in role_list %}
                {% if add_user.id in roles_list_new %}
                    <option selected value="{{ add_user.id }}">{{ add_user }}</option>
                {% else %}
                    <option  value="{{ add_user.id }}">{{ add_user }}</option>
                {% endif %}

            {% endfor %}
        </select>
    </div>
    <button type="submit" class="btn btn-primary">提交</button>
</form>
{% endblock %}

技术图片

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--配置手机端适应-->
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <!--配置css文件 核心CSS样式压缩文件-->
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.css">
    <style>
        .tou{
            margin-top: 100px;

        }


    </style>
</head>

<body>

<div class="container tou">
    <div class="row">
        <form class="form-horizontal col-md-6 col-md-offset-3 login-form" action="/login/" method="post">
            {% csrf_token %}
            <div class="form-group">
                <label for="username" class="col-sm-2 control-label">用户名</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="username" name="username" placeholder="用户名">
                </div>
            </div>
            <div class="form-group">
                <label for="password" class="col-sm-2 control-label">密码</label>
                <div class="col-sm-10">
                    <input type="password" class="form-control" id="password" name="password" placeholder="密码">
                </div>
            </div>

            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn-success" id="login-button">登录</button>
                    <span class="login-error"></span>
                </div>
            </div>
        </form>
    </div>
</div>



<!--配置jQuery-->
<script src="/static/bootstrap/jQuery.js"></script>
<!--配置 核心Boot script JS压缩文件-->
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>

技术图片

 

 

{% extends "base.html" %}


{% block con %}
    <h1>角色列表</h1>
    {% if "/add_users/" in permission_roles %}
        <a href="/add_roles/" class="btn btn-primary">添加角色</a>
    {% endif %}

    <table class="table table-bordered table-striped">
        <thead>
        <tr>
            <th>序号</th>
            <th>角色</th>
            <th>url</th>
                {% if ret %}
                <th>操作</th>
                {% endif %}


        </tr>
        </thead>
        <tbody>
        {% for roles in roles_list %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ roles }}</td>
                <td>
                    {% for roles_son in roles.permissions.all %}
                        {{ roles_son }} &nbsp;, &nbsp;
                    {% endfor %}
                </td>

            {% if ret %}
                <td>
                    {% if /delete_roles/(\\d+)/ in permission_roles %}
                    <a href="/delete_roles/{{ roles.id }}/" class="btn btn-danger">删除</a>
                        {% endif %}

                    {% if "/edeit_roles/(\\d+)/" in permission_roles %}
                    <a href="/edeit_roles/{{ roles.id }}/" class="btn btn-warning">编辑</a>
                    {% endif %}
                </td>

            {% endif %}
            </tr>
        {% endfor %}
        </tbody>
    </table>



{% endblock %}

技术图片

 

 

{% extends "base.html" %}


{% block con %}
    <h4>用户列表</h4>

    {% if "/add_users/" in permission %}
        <a href="/add_users/" class="btn btn-primary">添加用户</a>

    {% endif %}


    <table class="table table-bordered table-striped">
        <thead>
        <tr>
            <th>序号</th>
            <th>姓名</th>
            <th>角色</th>
            {% if ret %}
                <th>操作</th>
            {% endif %}
        </tr>
        </thead>
        <tbody>

        </tbody>
        {% for user in user_list %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ user.name }}</td>
                <td>
                    {% for role in user.roles.all %}
                        {{ role.title }}
                    {% endfor %}
                </td>
                {% if ret %}
                    <td>
                        {% if "/delete_users/(\\d+)/" in permission %}
                            <a href="/delete_users/{{ user.id }}/" class="btn btn-danger">删除</a>
                        {% endif %}


                        {% if "/edeit_users/(\\d+)/" in permission %}
                            <a href="/edeit_users/{{ user.id }}/" class="btn btn-warning">编辑</a>
                        {% endif %}

                    </td>
                {% endif %}


            </tr>

        {% endfor %}


    </table>

{% endblock %}

 

Djiango权限组件

标签:view   pen   path_info   int   temp   tin   mixin   pat   char   

原文地址:https://www.cnblogs.com/Rivend/p/11711252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!