权限判断-按钮控制功能(django前后端不分离)

image

功能说明:

在之前的功能中,我们对于用户的权限进行了校验,用户访问某些没有权限的url会显示无法访问,没有权限;

这只是对url级别进行了限制,我们对于权限的限制其实可以控制到某个页面的按钮,链接等;

如上图,如果当前登录用户没有添加用户的权限,那么我们就不应该给该用户展示该按钮!
这就是把权限进一步缩小了。

要实现这个功能,我们可以利用django中的自定义模板

例如:对应下面这个按钮,我们需要当该登录用户有权限时,在展示到页面上

<a href="{% url 'customer_add' %}" class="btn btn-success">
	<span class="glyphicon glyphicon-plus-sign"></span>新建
</a>

处理逻辑步骤:

  • 可以用自定义标签simple_tag,也可以用自定义模板inclsion_tag,我们这里先也simgle_tag做
from django import template
from django.conf import settings
from django.shortcuts import reverse
from django.utils.safestring import mark_safe

register = template.Library()


def is_permission(request, name):
    # 上述传入*args和**kwargs的作用是为了防止传来的url带不定参数,比如编辑和删除按钮
    # 1.根据传入的request获取当前用户的角色
    current_role = request.user.role

    # 2.去settings里读取该用户所拥有的权限字典
    permission_dict = settings.USER_PERMISSION[current_role]

    # 3.根据传入的url的name查看该name是否在权限字典内
    if name in permission_dict:
        return True

    # 判断是否有公共权限
    if name in settings.USER_PERMISSION_PUBLIC:
        return True


@register.simple_tag
def add_permission(request, name, *args, **kwargs):
    # 判断是否有权限
    if not is_permission(request, name):
        return ''

    # 4.有权限,返回按钮标签
    # 根据name和不定参数,反向生成url
    url = reverse(name, args=args, kwargs=kwargs)

    # 5.返回对应标签内容字符串,并用make_safe包裹
    tag = """
            <a href="{}" class="btn btn-success">
            <span class="glyphicon glyphicon-plus-sign"></span>新建
        </a>
    """.format(url)
    return mark_safe(tag)

@register.simple_tag
def edit_permission(request, name, *args, **kwargs):
    # 判断是否有权限
    if not is_permission(request, name):
        return ''

    # 4.有权限,返回按钮标签
    # 根据name和不定参数,反向生成url
    url = reverse(name, args=args, kwargs=kwargs)

    # 5.返回对应标签内容字符串,并用make_safe包括
    tag = """
         <a href="{}">
                        <button class="btn btn-sm btn-primary">编辑</button>
                    </a>
    """.format(url)
    return mark_safe(tag)

@register.simple_tag
def del_permission(request, name, *args, **kwargs):
    # 判断是否有权限
    if not is_permission(request, name):
        return ''

    # 4.取到要删除的行id
    rid = args[0]

    # 5.返回对应标签内容字符串,并用make_safe包括
    tag = """
        <button class="btn btn-sm btn-danger btn-del" row-id="{}">删除</button>
    """.format(rid)
    return mark_safe(tag)

  • 前端对应的添加、编辑、删除按钮就可以进行替换了
# 先加载自定义的simple_tag
{% load permission %}

# 添加按钮替换
    {% add_permission request 'customer_add' %}

# 编辑和删除按钮替换
     {% edit_permission request 'customer_edit' pk=item.id  %}
     {% del_permission request 'customer_del' item.id %}

这样,当我们修改配置文件里用户访问的权限时,对应页面的按钮就可以动态出现了

  • 小bug

当我们把编辑和删除按钮都去除的时候,页面显示是下图这样的,我们发现操作列还存在,我们想要当编辑和删除权限都没有的时候,就动态连操作列都不要生成了,那怎么做呢?

image

处理思路:

我们可以对于整体的td进行判断,如果这个td拥有编辑和删除权限之一,就展示该td,都没有该权限,则不展示该td

而simple_tag不支持放在if后面判断,所以,我们可以使用自定义filter
注意filter过滤器只支持传两个参数,我们需要传三个参数,我们可以将request当做一个,剩下两个参数以,拼接成一个,传到filter里,在进行拆分获取!!!
# filter过滤器
@register.filter
def has_permission(reqeust,others):
    name_list = others.split(',')
    for name in name_list:
        status = is_permission(reqeust,name)
        if status:
            return True

前端页面

            {% if request|has_permission:'customer_edit,customer_del' %}
                <th>操作</th>
            {% endif %}

                {% if request|has_permission:'customer_edit,customer_del' %}
                    <td>
                        {% edit_permission request 'customer_edit' pk=item.id %}
                        {% del_permission request 'customer_del' item.id %}
                    </td>
                {% endif %}
posted @ 2023-07-07 23:38  等日落  阅读(95)  评论(0编辑  收藏  举报