- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.5 根据权限设置链接
对于权限管理,我们可能希望,在一个用户访问的界面中,不是等到用户单击了一个超链接之后,才来判断用户有没有这个权限(虽然这种设计是必须的),而是按照用户拥有的权限来设置一个用户可以访问的超链接。这样的设计对于用户体验来说,显得更加友好。
以管理后台中用户管理的例子来说明如何实现根据权限来设置链接。如代码清单 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论