shiro怎么使用数据库动态权限

shiro怎么使用数据库动态权限,第1张

推荐一套完整的Shiro Demo,免费的。

下面的demo可以,可以从数据库和文件里读取权限

Shiro介绍文档:http://www.sojson.com/shiro

Demo已经部署到线上,地址是http://shiro.itboy.net,

管理员帐号:admin,密码:sojson.com 如果密码错误,请用sojson。PS:你可以注册自己的帐号,然后用管理员赋权限给你自己的帐号,但是,每20分钟会把数据初始化一次。建议自己下载源码,让Demo跑起来,然后跑的更快。

1. shiro中的重要概念

要理解shiro,先要理解框架的几个概念:

1) Subject : 代表当前登陆或者访问的用户

2) Principals :一般指用户名等,唯一表明Subject身份也就是当前用户身份的东西;

3) Credentials :凭证,一般指密码,对当前登陆用户进行验证;

4) Realms: 域,一般是指存储用户信息(用户名,密码,权限,角色)的数据库,也就是保存用户权限等信息的数据源

5) SecurityManager :shiro安全管理的顶级对象。它集合或者说调用所有其它相关组件,负责所有安全和权限相关处理过程,就像一个中央集权政府;

2. shiro的子系统

上面我们说到shiro的主要功能有:认证,授权,加密,session管理等。而每一个主要功能对应于shiro的一个子系统, 下面分别介绍。

3. Authentication认证子系统

认证子系统,就是处理用户登录,验证用户登录。

一般我们new一个UsernamePasswordToken的对象:UsernamePasswordToken token = new UsernamePasswordToken("xxxusername", "xxxpassword"),

然后 subject.login(token)就前去登录。相关代码一般如下:

Authentication 子系统会将password加密,然后使用username和加密之后的password和从Realm(一般是数据库)中根据usename获得的密码进行比较,相同就登录成功,不相同同就登录失败,或者用户名不存在也登录失败。就怎么简单。当然从Realm中根据用户名查找用户的过程是需要我们自己编码实现的。该功能的实现代码如下 。

4. Authorization 授权子系统(访问控制,权限控制)

在需要判断用户是否有某权限或者角色时,代码如下:

我们看到 doGetAuthorizationInfo 方法中使用了 SimpleAuthorizationInfo 类封装 Role 和 Permission.roles 和 stringPermissions 都是 String 类型的 Set, 也就是说,它们都是使用字符串来表示你拥有某个角色或者拥有某个权限的。

1) 两种访问控制方式:

SimpleAuthorizationInfo 封装了角色和权限,其实这也说明了实现“访问控制”两种方式:一是 “ 基于角色的访问控制 ” ;而是“ 基于资源的访问控制 ”。所谓的访问控制, 是指对于某个资源,当前用户是否有访问的权限。基于角色的访问控制是一种比较粗粒度的访问控制方式,只要你具有了某个或某几个角色,那么你就可以访问某资源。而基于资源的访问控制,是判断你针对该资源是否有某权限,有才能访问,粒度更细,你是否有某权限,可以根据你有哪些角色,然后改角色有哪些权限来判断的,当然也可以不引入角色的概念,直接判断你是否拥有某些权限。当然两种访问方式可以单独使用,也可以混合使用。比如对于比较简单的权限控制,你可以仅仅只使用基于角色的访问控制,仅仅引入角色表,不需要权限表都可以。混合使用是指,你可以同时要求用户具有某角色并且具有某些权限,才能访问某资源。所以shiro的权限控制时极其灵活的(当然也可以不引入角色表,仅仅引入权限表)。

2)权限的字符串表示方式

上面说到 角色 和 权限 都是使用字符串来表示的,其实 shiro 提供了一套比较强大有点复杂的权限字符串表示格式(分为:分割的三个部分):“ 资源: *** 作:对象实例ID ” 表示:对那个资源的哪个实例可以进行哪些 *** 作,支持通配符。多个 *** 作需要使用 “,” 逗号分割,而 “*” 放在三个位置上,分别表示:任意资源,任意 *** 作,任意实例。比如:"user:delete:1" 就表示 对user表的id等于1对应的数据或者对象,可以进行删除 *** 作。其实资源表现实现可以是对象,其实最终是对应到数据库表中的记录。再比如:"user:update,delete" 就表示 对user表(的任意实例)进行更新和删除 *** 作。"user:update,delete" 其实就等价于 “user:update,delete:*”所以 shiro 的访问控制可以控制到具体实例,或者说具体哪条数据库记录,也可以在表级别控制。如果省略掉 对象实例ID部分,就是在表级别控制。

3)权限相关表的设计

1>如果对于简单的情况,可以只使用“基于角色的访问控制”粗粒度方式,不涉及到权限,仅仅只通过判断是否有某角色来判断访问控制,那么就只需要增加一个角色表(roles) 和 一个角色(roles)和用户(user)的多对多的一个中间表——用户角色表(user_role)。

2>如果仅仅使用权限来控制访问,那么就可以仅仅只增加一个权限表(priv)和一个用户和权限的多对多的一个中间表——用户权限表(user_priv).

3>如果既要用到角色,又要用到权限(权限根据角色推算出来),那么就要增加:角色表,用户角色表,权限表,角色权限表。

4>其实还有一种情况:就是角色和权限没有关系,那么就可以增加:角色表,用户角色表,权限表,用户权限表。不过这种方式不同符合常规。

其他的 如 Cryptography 加密子系统 和 Session Management会话管理子系统 这里不做介绍。

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个 SpringBoot 长期系列教程,从入门到进阶, 篇幅会较多~

「大佬可以绕过 ~」

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ~

上期带大家学习了 Shiro 中如何进行权限认证,本期将带大家学习 Shiro 中如何进行 缓存和会话管理 ,最后我们将做一个在线用户管理以及强制下线用户的功能,同样的,我们集成到 Springboot 中。

首先我们要明白使用缓存的原因,为啥要用它 还记得之前带大家实现的 用户认证 权限认证 吗,那里我使用了 MockUser ,真实场景中是要去数据查询的,这样一来就会产生耗时,请求多的时候数据库肯定忙不过来了,所以我们需要使用缓存来提高程序响应速度

缓存使用 Redis ,下面就带大家整一下:

修改 ShiroConfig ,添加方法

这样就可以了,大家可以把测试获取用户的地方改成数据库获取,看下 控制台 sql日志会明显减少,因为有一部分是从缓存拿的

这部分功能还是比较好玩的,学完可以自由发挥做一个房间功能,可以加入可以踢人,下面我们就开整

修改 ShiroConfig ,添加方法,因为我们使用的是 Redis 缓存

实现 SessionListener

最后同样的,想要开启需要我们注入到 Manager 中:

我们先定义一个类,用来记录在线用户:

那么怎么获取呢?我们定义一个方法,大家实践中可以抽到 Service 层,这里方便演示,我直接写到控制器里

如果你看谁不爽,可以直接让他下线,hhh~

是不是很简单,这里就不演示了,大家自行试试

本期内容就到这里结束了,总结一下,本节主要讲了 Shiro 如何进行缓存以及如何进行用户会话管理,大家可以举一反三,做一些小功能尝试尝试

下期给大家讲讲 Shiro 中如何整合 JWT ,这个大家应该不陌生,如果不知道啥是 JWT 也没关系,我会带大家一步一步入门,下期也是 Shiro 系列的终极篇,内容可能有点多,耐心看完哦。欢迎加群一起学习交流 ~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10002903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存