开发者学堂课程【Spring Security知识精讲与实战演示(二):页面控制菜单的显示或隐藏】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/731/detail/13048
页面控制菜单的显示或隐藏
页面部分,先将两个处理器关闭。现在进入页面,需要做让进来的不同的人看到不同的结果。产品管理员只能看到产品,订单管理员只能看到订单。
现在可以在上图页面中采用动态标签的方式实现。在上面加入spring-security动态标签。<%@taglib uri=“导入标签:http://www.springframework.org/security/tags”prefix=”security”%>.
导入标签之后,下面的每一个可点击的菜单项都需要加上一个访问当前菜单需要的决策。按理说下图标蓝色的内容都要加
但是如果这一段加了之后,将来需要添加用户,改变决策可能会多次切换用户,有点麻烦。因此一些部分就不添加决策了。目前只给下面的添加。但是在项目开发中,上面标蓝的部分都是要添加的。
输入sec可以看到上图中有很多标签,里面的标签第一个和最后一个都已经用过了。
上图倒数第二个标签security:authentication可以用它获得当前登录之后认证的用户对象以及用户名等相关信息。这个标签其实之前也有涉及,来到header里面可以看到如下图,就是刚刚的倒数第二个标签:
需要对菜单进行全新的控制,需要用到security:authorize这个标签。写完之后后面会提供access,意思是通行。如何才能通行呢?需要在后面加上spring的表达式“hasanyrole”在这里面想要访问产品的时候,可以这样写:’ROLE-PRODUCT’’ROLE-ADMIN’意思是必须是产品管理员或者超级管理员才可以访问。这里要用单引号。之后将标签闭合。将结束的标签</security:authorize>写到</a></Ii>之后。现在产品的菜单就被保护起来了。意思就是要想访问产品管理必须是产品管理员这个角色或者是超级管理员。
同样的操作可用于订单管理。
写入security:authorize access=“hasrole”或者“hasanyrole”
需要对上面的标签进行改动,改动结果:’ROLE-ORDER’’ROLE-ADMIN’。将</security:authorize>写到</a></Ii>之后。这样今后只有产品管理员的角色,登录之后就只能看到产品管理,订单管理是看不到的。
将已经改好的代码做测试,先启动项目。再一次访问:
使用用户名xiaoma登录,点击登录。这时点击基础数据会发现没有东西在里面。没有东西是正常的,因为目前还没有这个操作角色。但是上面的东西都是可以看到的。可以对用户修改角色,目前没有角色,然后添加一个角色。点击新建,名称防止写错可以在代码中直接复制’ROLE-PRODUCT’’,之后粘贴进去。角色描述就是管理产品,点击保存。页面显示403,意思是权限不足。
目前提交的时候csrf开启了,为了今后方便测试,将csrf拦截关闭,因为目前已经知道如何操作,每次开启csrf很多功能都用不了,每一个都需要加,操作繁琐,所以现在暂时屏蔽csrf这个功能。
再次访问,使用用户名xiaoma登录,点击登录。打开系统管理,点击角色中的新建,输入角色名称:ROLE-PRODUCT,角色描述:管理产品,点击保存。新建成功。
继续新建,将ROLE-ORDER输入到角色名称,角色描述:管理订单。点击保存。目前就新建好了管理产品和管理订单。如下图:
有了以上两个管理之后,需要给用户权限,不给用户权限在用户端还是无法看到信息。
对小明的角色进行修改,现在小明的角色只能是用户,去掉他超级管理员的角色。给小明设置一个产品管理的角色。点击保存。
操作过程出现了问题,但是与本节课学习的内容无关,直接在数据库中修改。
在role中看到有两个用户,找到角色。可以看到现在是4个小明。
找到产品。产品前面是8.
可以将4,7去掉,因为是超级管理员。刷新,然后输入4,8.如下图:
这里的4代表的是小明,8代表的是产品管理。说明小明具有了产品管理的权限。9代表订单管理,分给小马,小马的标号是5。则5,9代表小马具有订单管理的权限。6必须要有。在下方输入框中输入5和9。保存。
以上可以用代码实现刚刚在数据库内手动操作的步骤。这些代码目前可能没有写完善,因此暂时手动添加,也可以看出效果。
上图可见所有参数已经修改好了。
6代表的是基本角色,这是每一个操作者都需要具备的。没有6是无法操作的,可以看到在spring-security文件中要求任何资源都必须有这个角色。如果没有这个角色页面菜单都是无法访问的,同时里面的权限也不能访问。所以USER是最基本的角色,必须都要设置。相当于在中间表中每一个用户UID都要有6这个角色,其余的可以没有。要想访问,必须要有6。
改好上述信息之后,再一次退出,重新登录。登录xiaoming用户,在主页面中只能看到产品管理,因为xiaoming只具备管理产品的权限,只有产品管理的角色,只能看见产品。上面的系统管理暂时所有用户都可以访问。
注销之后登录xiaoma页面,这时的基础数据内小马只能看到订单管理。点击进去也是可以访问的。小马的产品管理也是可以访问的。
每个用户进入页面只可以看到负责的页面,虽说都已经被控制。但是到目前为止权限管理其实并没有完全开始。
做到目前,在公司中内部使用是可以的。但是需要员工的自觉,如果遇到知道内部设置的员工,是不可以的。
例如现在登录的小马,目前公司只是希望小马可以管理订单,不能查看产品的相关信息。但是如果小马是公司的员工知道公司访问后台的地址,小马就可以手动在地址栏中拼接访问的处理器地址。将order改为product,刷新之后会发现小马此时也可以访问产品管理。点击基础数据,虽然只是显示订单管理,但是小马也可以访问到产品管理的页面。所以只是做到以上的操作,系统后台是很容易被人攻击的。
也就是说spring-security的动态标签只是在页面上做了假动作,只过滤了当前按钮显示或者隐藏。如果设置了这个角色,可以通过页面显示出来,如果没有这个角色,只是将这个按钮隐藏了,但是只是进行隐藏,并没有不允许访问。所以做到上述的操作是远远不够的。但是公司中还是需要做上述操作,假如没有此操作,菜单栏会有许多选项,浪费员工的时间。需要做到的是用户体验和功能双行,用户体验要好指的就是当前用户能够访问什么功能就只展示什么功能。功能的强壮是指后台的控制,不能访问的信息就绝对不能访问,能访问的确实能访问。