Shiro不同身份多个Realm的问题及反思

需求

我在做项目时(个人博客),分为前台登录(User)和后台登录(Admin),因此数据库存在两张表user和admin,分别记录普通用户和管理员的信息。并且现在要实现普通用户和管理员的分开登录,即需要两个Realm——UserRealm和AdminRealm,分别处理普通用户和管理员的验证功能。
 
  但是问题在于,Shiro本身并不支持这样做,必须通过自定义Shiro的一些配置和扩展,才可以实现想要的功能。

存在的问题

我经过了全网搜寻,大致上的解决方案就是重写doAuthenticate()方法,让特定的Realm完成特定的功能。还有就是定义一个字段loginType,用于Controller层判断究竟是调用哪个Realm。网上的方法有很多:

shiro实现不同身份使用不同Realm进行验证
SSM整合shiro实现多用户表多Realm统一登录认证(大章附代码)

我这里就不详细解释了,它们也不是本文的重点。本文的重点是,你的项目中如果使用了不同身份多个Realm的解决方案,其项目设计,数据表结构创建本身就是有问题的。

原因在于,第一是使用这种方法,容易出现只要任意一个身份登陆了,另一个身份不需登录就可以随便访问资源的情况; 第二是这种方法比较繁琐,在Controller中也不能直接调用UsernamePasswordToken;第三是不便于我们对各类用户的管理。

设计上的反思
这种做法不便于我们对各类用户的管理,虽然做了很多针对shiro的扩展去实现自己想要的功能,但渐渐明白为什么shiro不提供这样的解决方案。

这里,博主也建议,用户表可以有多个,但登录认证的表其实只保留一个就好,将你的多Realm抽象出来一个关系表映射,将各种状态加入,登录等认证交由统一维护,具体信息查询等封装抽象,下面做对应实现即可,这样才应该是跨平台的,以后也只需要存储跟别的平台的用户关系绑定,就完成了登录。

解决方案

在数据库最初设计时,实现登陆认证的表应该只有一个,然后通过表之间的关联关系来分配角色和权限(表设计例如下图所示,图来源于B站up主:编程不良人):
在这里插入图片描述这样只需要写单个Realm(用户的Realm)就能解决问题。至于该用户究竟是普通用户还是管理员,由该用户表关联的角色表决定。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值