Shiro的学习(三)

Source
				版权声明:重在参与,贵在分享					https://blog.csdn.net/wohaqiyi/article/details/79323589				</div>
							            <div id="content_views" class="markdown_views prism-atom-one-dark">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p>接上一篇文章<a href="http://blog.csdn.net/wohaqiyi/article/details/79322375" rel="nofollow" target="_blank">关于shiro框架的简单介绍及用户表的建立维护</a> <br>

项目已分享到GitHub上,如果需要的可以看下,springboot+shiro项目Git下载地址

本篇主要通过一个已经实现用户登录和权限验证的系统,结合sql,展示一下我的实现。

首先我设置的权限,即功能表,其中func_type 字段分为四类(系统、模块、菜单、操作)。

一、系统的展示

  下边对于同一个系统内,一个用户,我在不同授权下的展示情况:
这里写图片描述
  不好意思,公司系统,我还是不要全贴出来了。
  当前用户我是授权的是测试角色,对于当前的角色我赋予的是以上的功能,即只显示了首页、系统管理、资源管理三个模块,以及部分菜单。下边是我对当前用户授权的测试角色
这里写图片描述
  然后我再将当前用户改为赋予测试角色2,来看一下效果。

这里写图片描述

这里写图片描述

以上,我只是贴出来对于功能的系统、模块、菜单的三种分类,对于操作类,在这里其实就是按钮的控制。而对于按钮的控制,我是通过shiro标签来实现的,但是前三种,实际上就是根据sql查询返回给前端的。
 对于上图中的系统类,其实存储在功能表中,是将那个图片,比如test.png这个字符串存储在功能表上的func_url 字段上
 对于上图中的模块类,其实多加了一级,用来将菜单类归类一下,func_url 上存储的是空字符串。
 对于上图中的菜单类,这个是主要的内容,其实只是将前端对于某个jsp的路径,比如/views/test.jsp 这样的字符串,存储到func_url 字段上。
 当然以上三种,都要存储到对应的func_type 字段,即要选对相应的功能类型。

二、基于sql的实现

  角色上授予不同功能

这里写图片描述
 这里其实就是拿着当前角色的id,还有勾选的多个功能id,然后去添加了多条角色功能关联表的记录。这样就将当前角色id与多种功能关联起来了。

  用户上授予不同角色

这里写图片描述
 这里的用户,当然可以授予多个角色,这里我仅仅只是授予了一个角色,不管几个,其实也就是在保存的时候,去添加用户角色关联表,将用户id和角色id关联起来。这样就在一个用户上绑定了多个角色,如果你这些角色上带有对应的site_id ,即站点,那相当于你可以对当前用户赋予多个系统站点的角色,这样在登录的时候,可以通过site_id 来筛选是否有某个系统的登录权限了。有些人可能觉得siteid应该放到功能表里,我这里放到角色里,是方便于在登录系统验证的时候少关联两张表,只要自己合理应用,我觉得没问题。
  以下是用户在授予多个角色下结构图,挺简单的:
这里写图片描述

  用户登录后,获取当前站点的角色的所有权限,这也是我最上边的实现sql

select distinct f.* from sys_User u,Sys_User_Role_R ur,sysy_Role r,Sys_Func_Role_R fr,Sys_Func f where u.user_id = ur.user_Id and ur.role_Id=r.id and r.id=fr.role_Id and fr.func_Id=f.id and u.user_name='lsf' and r.site_id='1' and f.func_type !=4
就是将这五张表关联一下,然后根据用户表的user_name 字段和角色表的site_id来查询出属于当前用户的站点1系统的功能列表,上边func_type != 4 表示不查询按钮类的功能,因为按钮类我是通过shiro的标签来控制的。关于shiro标签的应用,看这篇文章,shiro框架—关于项目按钮权限控制的配置要点
  这样在用户登录该系统后,就可以根据该sql,查询出来属于当前用户,当前系统的所有功能列表。返回给前端,前端再根据不同的功能类型(没有返回按钮,即类型为4的功能),分类,从func_url 中获取出值来,填充到前端的样式中,这样就实现了不同用户与功能的关联。
  说到这里,我觉得肯定还有人有疑问,我这样返回,前端怎么实现,其实这个很好实现,另外,我觉得不要关心前端如何展示,我们只需要关心实现根据不同用户,不同系统,返回相应的结果即可,其他的等你看到一次前端怎么实现的就知道有多简单了。
下一篇,进入shiro框架在系统项目中的配置介绍
下一篇文章shiro框架—shiro配置介绍(一)

				版权声明:重在参与,贵在分享					https://blog.csdn.net/wohaqiyi/article/details/79323589				</div>
							            <div id="content_views" class="markdown_views prism-atom-one-dark">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p>接上一篇文章<a href="http://blog.csdn.net/wohaqiyi/article/details/79322375" rel="nofollow" target="_blank">关于shiro框架的简单介绍及用户表的建立维护</a> <br>