关于用户登录和权限验证功能的实现步骤(八)
本文转载自凌大大的博客,原博客地址:[关于用户登录和权限验证功能的实现步骤](https://blog.****.net/wohaqiyi/article/details/79480837)
关于shiro框架中用户多站点登录的标识字段的位置
上一篇文章shiro框架—关于用户登录和权限验证功能的实现步骤(七)
项目已分享到GitHub
上,如果需要的可以看下,springboot+shiro项目Git下载地址。
在shiro框架—关于用户登录和权限验证功能的实现步骤(一)文章里,我写过建表的内容,其中提到了功能表
、角色表
有关siteId
的放置位置。
首先再回顾下,我们整个用户、角色、功能配置上所要建立的表:
- 用户表 (SYS_USER)
- 用户角色关联表 (SYS_USER_ROLE_R)
- 角色表 (SYS_ROLE)
- 角色功能关联表 (SYS_FUNC_ROLE_R)
- 功能表 (SYS_FUNC)
通过以上表实现一个用户多站点登录的功能,但是关于siteId
放置的位置还需要说明一下我自己的看法。
1、不能放到用户表
毫无疑问,无法实现一个用户对应多个站点的功能。
1、可以放到功能表中
放到功能表中是可以实现的,因为用户上又授予多个角色,角色上授予多个功能,这样在用户登录的时候,可以根据用户名,一直关联查询,看看是否当前用户拥有属于当前站点的功能,如果拥有,即可以登录,如果没有,即登录失败。
但是,大家可以看看上图,我们的五张表,如果按照我上边的说的,固然可以实现关联,而且我们自己系统是这样实现的。但是我觉得不好,因为这样做的后果就是,当一个用户登录系统的时候,就先关联查询用户表
、用户角色关联表
、角色表
、角色功能关联表
、功能表
五张表,然后通过查询到的所有功能列表中,查找siteId
的值是否与当前站点的值一致,一致即可以登录。这样一个登录功能却匹配了五张表才能实现反馈,我觉得不是很好。
3、可以放到角色表和功能表中
如果只放到角色表中,这样通过用户授予多个站点角色,可以实现用户对应多个角色的功能。但是这个也有个问题,如果siteId
只放到角色表,当在某个站点角色授权功能的时候,就必须只能选择属于当前站点的一些功能,至于其他站点的功能就不能选择。如下:
如上图,站点系统1
和站点系统2
是两个系统的功能,但是我在给当前属于站点系统1
的角色授权的时候,显示功能列表,最好的结果是,只会显示站点系统1
l里所有的功能,但是因为功能表里没有关于siteid
的信息,即每一条功能信息,无法知道它是属于哪个站点系统的。因此这里的查询会把所有的功能列表都展示出来。
既然如此,那么再到功能表中,添加一个siteid
,这样的话,上图做筛选的时候,就可以根据角色上的siteid
,查询出只属于当前站点系统
的功能即可。
即如下图所示:
这样做,虽然是两次定义siteId
但是,在用户登录的时候,不用像第2条中的那样,去匹配五张表,这样只需要匹配到角色表,即三张表,即可。虽然只是少了两张表,但是角色
数据远远少于功能
数据。因此匹配的数据量也是少了很多的。
所以,我觉得第三种的方式是最好的方式。
本文转载自凌大大的博客,原博客地址:[关于用户登录和权限验证功能的实现步骤](https://blog.****.net/wohaqiyi/article/details/79480837)
关于shiro框架中用户多站点登录的标识字段的位置
上一篇文章shiro框架—关于用户登录和权限验证功能的实现步骤(七)
项目已分享到GitHub
上,如果需要的可以看下,springboot+shiro项目Git下载地址。
在shiro框架—关于用户登录和权限验证功能的实现步骤(一)文章里,我写过建表的内容,其中提到了功能表
、角色表
有关siteId
的放置位置。
首先再回顾下,我们整个用户、角色、功能配置上所要建立的表:
- 用户表 (SYS_USER)
- 用户角色关联表 (SYS_USER_ROLE_R)
- 角色表 (SYS_ROLE)
- 角色功能关联表 (SYS_FUNC_ROLE_R)
- 功能表 (SYS_FUNC)
通过以上表实现一个用户多站点登录的功能,但是关于siteId
放置的位置还需要说明一下我自己的看法。
1、不能放到用户表
毫无疑问,无法实现一个用户对应多个站点的功能。
1、可以放到功能表中
放到功能表中是可以实现的,因为用户上又授予多个角色,角色上授予多个功能,这样在用户登录的时候,可以根据用户名,一直关联查询,看看是否当前用户拥有属于当前站点的功能,如果拥有,即可以登录,如果没有,即登录失败。
但是,大家可以看看上图,我们的五张表,如果按照我上边的说的,固然可以实现关联,而且我们自己系统是这样实现的。但是我觉得不好,因为这样做的后果就是,当一个用户登录系统的时候,就先关联查询用户表
、用户角色关联表
、角色表
、角色功能关联表
、功能表
五张表,然后通过查询到的所有功能列表中,查找siteId
的值是否与当前站点的值一致,一致即可以登录。这样一个登录功能却匹配了五张表才能实现反馈,我觉得不是很好。
3、可以放到角色表和功能表中
如果只放到角色表中,这样通过用户授予多个站点角色,可以实现用户对应多个角色的功能。但是这个也有个问题,如果siteId
只放到角色表,当在某个站点角色授权功能的时候,就必须只能选择属于当前站点的一些功能,至于其他站点的功能就不能选择。如下:
如上图,站点系统1
和站点系统2
是两个系统的功能,但是我在给当前属于站点系统1
的角色授权的时候,显示功能列表,最好的结果是,只会显示站点系统1
l里所有的功能,但是因为功能表里没有关于siteid
的信息,即每一条功能信息,无法知道它是属于哪个站点系统的。因此这里的查询会把所有的功能列表都展示出来。
既然如此,那么再到功能表中,添加一个siteid
,这样的话,上图做筛选的时候,就可以根据角色上的siteid
,查询出只属于当前站点系统
的功能即可。
即如下图所示:
这样做,虽然是两次定义siteId
但是,在用户登录的时候,不用像第2条中的那样,去匹配五张表,这样只需要匹配到角色表,即三张表,即可。虽然只是少了两张表,但是角色
数据远远少于功能
数据。因此匹配的数据量也是少了很多的。