思考题

  1. 权限与菜单之间是否存在关系?如果有,请说明它俩之间的关系;如果没有,请说明原因。

答案:权限与菜单之间没有关系。权限是用来限制用户的后台操作,而菜单是用来限制用户在前台所能看到的内容,虽然都是对用户进行限制,但是却是完全不同的领域。虽然菜单可以限制我们在页面上所能看到的内容,但是这并不能限制我们对后台数据库的操作,例如我们可以直接在浏览器地址栏上输入一个后台请求即可,如果这个时候不对这个请求所对应的操作进行限制,那么系统就会出现严重的安全问题,所以这个时候权限的作用就能体现出来了。所以,菜单是作用于前台,权限是作用于后台,虽然在JSP当中可以使用shiro标签来根据角色或权限来控制页面中的内容,但是这本质上就是一个后台代码的逻辑判断而已。

 

  1. 为什么添加角色时菜单id需要拼接成一个字符串进行提交,而权限id却不需要?

答案:添加角色页面加载后会发起ajax请求查询所有的权限数据,我们在ajax的回调函数中遍历权限数据并将每个权限id数据都拼接成一个类型为复选框的输入框,然后将输入框追加到页面中,这个时候就会在页面中有name属性相同type属性都为checkbox的输入框,那么在表单提交时就会将权限id数据封装到权限id数组中。

 

而菜单id由于我们需要将菜单显示成ztree树形结构,而ztree树形结构本质上就是在ul标签中放入一些li标签而已,而这些标签当中的值在表单提交的时候是无法提交到后台的,所以我们需要使用ztree内置的方法获取到选中的节点并拿到节点id,将这些节点id进行拼接后再将拼接后的字符串设置到表单的隐藏域中,那么当表单提交的时候隐藏域中存放的菜单id字符串就会被提交到后台了。

 

  1. 什么时候系统才会去执行realm当中的授权方法?

答案:在URL拦截规则中,如果指定了该URL需要具备某些权限,那么Shiro安全管理器将调用Realm中的授权方法获取到权限信息并与URL需要的权限信息进行匹配,如果URL需要的权限信息在授权方法返回的权限信息中能找到,那么该请求就能正常往下执行,否则就报权限不足并进入权限不足页面。

 

service方法上加权限限制注解,那么当action调用service的代理类方法时,将根据该方法上的权限限制注解信息去执行Realm的授权方法并匹配权限信息,如果匹配就执行service实现类中的方法,否则就报权限不足并进入权限不足页面。

 

JSP页面中使用Shiro的标签来对某一块内容进行权限控制显示,当解析JSP页面时执行到了Shiro标签那一块时将会去执行Realm中的授权方法并匹配Shiro标签中的权限信息,如果匹配那么这一块限制的内容就能在页面上显示,否则就不显示。

 

  1. 为什么要使用ehcache整合shiro?

答案:当系统执行过程中遇到了Shiro的权限限制时将会执行Realm中的授权方法并查询后台数据库的权限信息。在系统当中有很多地方会进行权限限制,如果访问每一个资源都要去走Realm中的授权方法并查询后台数据库,那么这无疑将会极大的浪费数据库的资源而且还影响性能,所以为了提交访问效率,我们可以将已经授权好的用户权限信息缓存到ehcache中,那么等下次请求进来时将直接从缓存当中读取权限数据,而不用走授权方法和查询数据库。

 

  1. 简单描述下系统菜单根据登录人动态展示的流程

答案:当用户登录时,Shiro将会把用户认证数据存放到Session中。当进入后台系统首页时,首页页面加载后发起ajax请求获取菜单数据,在请求中将会携带keyjSessionidcookie,后台系统的Shiro根据该cookie就能找到Session,而Session中存放了用户认证数据,所以Shiro会放行。当请求到达了action的查询菜单方法时,根据当前登录的用户把对应的菜单数据查询出来并以JSON的形式回显到页面,页面的ajax回调函数拿到JSON数据后将JSON数据以ztree树形结构显示在页面中。这就是系统菜单根据登陆人动态展示的流程。

猜你喜欢

转载自www.cnblogs.com/shan1393/p/9250374.html