关于用户登录和权限验证功能的实现步骤(八)

本文转载自凌大大的博客,原博客地址:[关于用户登录和权限验证功能的实现步骤](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条中的那样,去匹配五张表,这样只需要匹配到角色表,即三张表,即可。虽然只是少了两张表,但是角色 数据远远少于功能 数据。因此匹配的数据量也是少了很多的。

所以,我觉得第三种的方式是最好的方式。