返回介绍

5.5 根据权限设置链接

发布于 2025-04-26 13:26:33 字数 4484 浏览 0 评论 0 收藏 0

对于权限管理,我们可能希望,在一个用户访问的界面中,不是等到用户单击了一个超链接之后,才来判断用户有没有这个权限(虽然这种设计是必须的),而是按照用户拥有的权限来设置一个用户可以访问的超链接。这样的设计对于用户体验来说,显得更加友好。

以管理后台中用户管理的例子来说明如何实现根据权限来设置链接。如代码清单 5-23 所示,在打开用户管理主页的控制器中,读取了当前用户的权限配置,然后根据这个用户的权限列表来判断这个用户是否拥有新建、修改和删除等权限,最后把这些权限通过变量传给页面,由页面负责根据权限来设置用户可用的超链接。其中,newrole、editrole 和 deleterole 分别表示新建、修改和删除权限的判断值。

代码清单 5-23 在控制器中获取用户权限

@Value("${securityconfig.urlroles}")
    private String urlroles;
    @RequestMapping("/index")
    public String index(ModelMap model, Principal user) throws Exception{
        Authentication authentication = (Authentication)user;
        List<String> userroles = new ArrayList<>();
        for(GrantedAuthority ga : authentication.getAuthorities()){
            userroles.add(ga.getAuthority());
        }
        boolean newrole=false,editrole=false,deleterole=false;
        if(!StringUtils.isEmpty(urlroles)) {
            String[] resouces = urlroles.split(";");
            for (String resource : resouces) {
                String[] urls = resource.split("=");
                if(urls[0].indexOf("new") > 0){
                    String[] newroles = urls[1].split(",");
                    for(String str : newroles){
                        str = str.trim();
                        if(userroles.contains(str)){
                            newrole = true;
                            break;
                        }
                    }
                }else if(urls[0].indexOf("edit") > 0){
                    String[] editoles = urls[1].split(",");
                    for(String str : editoles){
                        str = str.trim();
                        if(userroles.contains(str)){
                            editrole = true;
                            break;
                        }
                    }
                }else if(urls[0].indexOf("delete") > 0){
                    String[] deleteroles = urls[1].split(",");
                    for(String str : deleteroles){
                        str = str.trim();
                        if(userroles.contains(str)){
                            deleterole = true;
                            break;
                        }
                    }
                }
            }
        }
        model.addAttribute("newrole", newrole);
        model.addAttribute("editrole", editrole);
        model.addAttribute("deleterole", deleterole);
        model.addAttribute("user", user);
        return "user/index";
    }

在用户管理的主页视图中有一个“新增”超链接,可以通过控制器传递过来的 newrole 值来判断这个用户对这个链接有没有权限,从而决定这个链接能不能显示出来,提供给用户使用,代码如下:

<div class="newBtnBox" th:if="${newrole}">
<a id="addUserInf" class="blueBtn-62X30" href="javascript:void(0)">新增




</a>
</div>

而对于修改和删除的权限,因为页面的数据是从 js 中生成的,所以可以在生成用户列表的程序段中判断 editrole 和 deleterole,从而决定是否提供这两个功能的链接,如代码清单 5-24 所示。

代码清单 5-24 在 js 中根据用户权限设置链接

// 填充分页数据





function fillData(data){
    var editrole = $("#editrole").val();
    var deleterole = $("#deleterole").val();
    var $list = $('#tbodyContent').empty();
    $.each(data,function(k,v) {
        var html = "";
        html += '<tr> ' +
            '<td>' + (v.id == null ? '' : v.id) + '</td>' +
            '<td>' + (v.name == null ? '' : v.name) + '</td>' +
            '<td>' + (v.email == null ? '' : v.email) + '</td>' +
            '<td>' + (v.createdate == null ? '' : getSmpFormatDateByLong(v.createdate, true)) + '</td>';
        html += '<td><a class="c-50a73f mlr-6" href="javascript:void(0)" onclick=
"showDetail(\'' + v.id + '\')">查看




</a>';
        if (editrole == 'true')
            html += '<a class="c-50a73f mlr-6" href="javascript:void(0)" onclick=
"edit(\'' + v.id + '\')">修改




</a>';
        if(deleterole == 'true')
            html += '<a class="c-50a73f mlr-6" href="javascript:void(0)" onclick=
"del(\''+ v.id+'\')">删除




</a>';
        html +='</td></tr>' ;
        $list.append($(html));
    });
}

其中的“修改”和“删除”权限的判断值,即代码中的 editrole 和 deleterole,是在导入用户管理的主页时使用隐藏的输入框这种方式传递进来的,代码如下:

<input type="hidden" name="editrole" id="editrole" th:value="${editrole}"/>
<input type="hidden" name="deleterole" id="deleterole" th:value=
"${deleterole}"/>

上面这种根据权限设置链接的设计,只是在一个局部操作界面上实现,在实际应用中,可以通过统筹规划全局视图,在全局的角度中实现这种设计。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。