- 前言
- 第一部分 基础应用开发
- 第 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}"/>
上面这种根据权限设置链接的设计,只是在一个局部操作界面上实现,在实际应用中,可以通过统筹规划全局视图,在全局的角度中实现这种设计。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论