shiro入门笔记
- 第一章 Shiro简介
-
- 1.1 什么是Shiro?
- 1.2 Shiro框架结构
-
- 1.2.1 Shiro主要三大核心注件
- 1.2.2 主要功能
- 第二章 认证
-
- 2.1 新建一个springboot项目
- 2.2 测试接口
- 2.3 登录流程总结
-
- 2.3.1 登录认证策略
- 第三章 授权
-
- 3.1授权方式
- 3.2 权限通配符
- 3.3 代码授权演示
- 第四章 过滤器
-
- 4.1过滤器类关系
- 4.2 自定义过滤器
- 第五章 加密&解密
-
- 5.1 常用加密算法
- 第六章 会话管理
-
- 6.1shiro会话
- 6.2会话获取
- 6.3 会话管理
- 第七章 RememberMe
-
- 7.1 开启记住我功能
- 第八章 缓存
-
- 8.1 开启缓存
- 第八章 Shiro连接Mybatis
-
- 8.1 数据库脚本
- 8.2 测试
第一章 Shiro简介
1.1 什么是Shiro?
Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro 要简单的多。
1.2 Shiro框架结构
shiro是一个独立的安全框架,不跟任何的框架或者容器捆绑,可以独立运行,完整的框架结构如下
1.2.1 Shiro主要三大核心注件
三个核心组件:Subject, SecurityManager 和 Realms。
Subject:即“当前操作用户”。不仅仅是指人,可以是第三方的应用交互,比如,后台进程自己访问应用。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
1.2.2 主要功能
Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
Session Management:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
Web Support:Web 支持,可以非常容易的集成到 Web 环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色 / 权限不必每次去查,这样可以提高效率;
Concurrency:shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我功能,开启默认下次不用登录。
第二章 认证
2.1 新建一个springboot项目
- 完整的pom.xml文件如下
- 创建ShiroConfig.java
- 创建MyRealm.java
- 定义 login.html
- 定义 success.html
- 定义 noPermission.html
- 定义 loginController.java
2.2 测试接口
访问login
登录成功
访问user/add 或者admin/add 会跳转到登录页面。
总结:到这里,shiro的简单认证就完成了
2.3 登录流程总结
principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个 principals,但只有一个 Primary principals,一般是用户名 / 密码 / 手机号。
credentials:证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等。
最常见的 principals 和 credentials 组合就是用户名 / 密码了。
另外两个相关的概念是之前提到的 Subject 及 Realm,分别是主体及验证主体的数据源。
登录流程:
1.首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager() 设置;
2.SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;
3.Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
4.Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证;
5.Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 / 抛出异常表示身份验证成功了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访。
2.3.1 登录认证策略
FirstSuccessfulStrategy:只要有一个 Realm 验证成功即可,只返回第一个 Realm 身份验证成功的认证信息,其他的忽略;
AtLeastOneSuccessfulStrategy:只要有一个 Realm 验证成功即可,和 FirstSuccessfulStrategy 不同,返回所有 Realm 身份验证成功的认证信息;
AllSuccessfulStrategy:所有 Realm 验证成功才算成功,且返回所有 Realm 身份验证成功的认证信息,如果有一个失败就失败了。ModularRealmAuthenticator 默认使用 AtLeastOneSuccessfulStrategy 策略。
Shiro支持的各种数据域结构图:
AuthorizingRealm授权域继承了AuthenticatingRealm认证域的类,所以我们只需要继承AuthorizingRealm域就可以实现自己的认证与授权操作。
第三章 授权
3.1授权方式
1.通过代码授权,使用subject主体实例去实现
2.通过注解的方式
@RequiresAuthentication:使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在已经过认证。
@RequiresGuest:使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是gust身份,不需要经过认证或者在原先的session中存在记录。
@RequiresPermissions:当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。
@RequiresRoles:当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。
@RequiresUser:当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。
- 通过页面方式
3.2 权限通配符
规则:“资源标识符:操作:对象实例 ID” 即对哪个资源的哪个实例可以进行什么操作。其默认支持通配符权限字符串,“:”表示资源/操作/实例的分割;“,”表示操作的分割;“*”表示任意资源/操作/实例
1.操作单个权限 @RequiresPermissions(“system:user:update”)
2.操作多个权限 @RequiresPermissions({“system:user:update,system:user:delete”})如果拥有两个权限可以简写@RequiresPermissions({“system:user:update,delete”})
3.拥有全部权限 @RequiresPermissions(“system:user:“)或者@RequiresPermissions(“system:user”)
4.单个权限 @RequiresPermissions(:view*”)
5.单个实例的单个权限 @RequiresPermission(“user:view:1”) 表示实例1对当前资源有访问权限。
6.Shiro 对权限字符串缺失部分的处理。
前缀匹配原则:如(“system:delete:”)等价于(“system:delete:*”),而(“system”)等价于(“system: * ”)与(“system: * : *”);这样就完成了前缀匹配。
后缀匹配原则:如(“ :update”)不能匹配(“system:user:update”)需要知道全部匹配规则,如(“ * : :update”)才能匹配到相应的资源。
3.3 代码授权演示
这个继承了AuthorizingRealm 类,而该类又继承了认证类AuthenticatingRealm,所以我们在一个realm中实现自己的认证与授权方法。
CredentialsMatcher类是拥有密码匹配认证,如果正确返回true;
修改ShiroConfig类的MyRealm类方法
第四章 过滤器
4.1过滤器类关系
1、NameableFilter
NameableFilter 给 Filter 起个名字,如果没有设置默认就是 FilterName;还记得之前的如 authc 吗?当我们组装拦截器链时会根据这个名字找到相应的拦截器实例;
2、OncePerRequestFilter
OncePerRequestFilter 用于防止多次执行 Filter 的;也就是说一次请求只会走一次拦截器链;另外提供 enabled 属性,表示是否开启该拦截器实例,默认 enabled=true 表示开启,如果不想让某个拦截器工作,可以设置为 false 即可。
3、ShiroFilter
ShiroFilter 是整个 Shiro 的入口点,用于拦截需要安全控制的请求进行处理,这个之前已经用过了。
4、AdviceFilter
AdviceFilter 提供了 AOP 风格的支持,类似于 SpringMVC 中的 Interceptor
5、PathMatchingFilter
PathMatchingFilter 提供了基于 Ant 风格的请求路径匹配功能及拦截器参数解析的功能,如“roles[admin,user]”自动根据“,”分割解析到一个路径参数配置并绑定到相应的路径:
6、AccessControlFilter
AccessControlFilter 提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等
4.2 自定义过滤器
修改ShiroConfig类,设置过滤器
第五章 加密&解密
5.1 常用加密算法
Base64 加密&解密
MD5Hash加密
Sha256Hash加密算法
SimpleHash加密算法
AesCipherService加密&解密算法
注入PasswordService服务类,即可调用加密算法
第六章 会话管理
6.1shiro会话
shiro提供的会话不依赖任何底层容器,提供了会话管理、会话事件监听、会话存储 / 持久化、容器无关的集群、失效 / 过期支持、对 Web 的透明支持、SSO 单点登录的支持等特性。使用shiro的会话管理可以代替web的会话管理。
6.2会话获取
subject.getSession(true)如果为true,表示如果没有会话就创建一个会话,为false表示没有返回空。
获取会话的启动时间及最后访问时间;如果是 JavaSE 应用需要自己定期调用 session.touch() 去更新最后访问时间;如果是 Web 应用,每次进入 ShiroFilter 都会自动调用 session.touch() 来更新最后访问时间。当 Subject.logout() 时会自动调用 stop 方法来销毁会话。如果在 web 中,调用 javax.servlet.http.HttpSession. invalidate() 也会自动调用 Shiro Session.stop 方法进行销毁 Shiro 的会话
6.3 会话管理
Shiro 提供了三个默认实现:
DefaultSessionManager:DefaultSecurityManager 使用的默认实现,用于 JavaSE 环境;
ServletContainerSessionManager:DefaultWebSecurityManager 使用的默认实现,用于 Web 环境,其直接使用 Servlet 容器的会话;
DefaultWebSessionManager:用于 Web 环境的实现,可以替代 ServletContainerSessionManager,自己维护着会话,直接废弃了 Servlet 容器的会话管理。
第七章 RememberMe
7.1 开启记住我功能
UsernamePasswordToken实现了记住我功能,直接传人值即可
第八章 缓存
8.1 开启缓存
开启shiro自带的缓存。
导入shiro缓存依赖
修改ShiroConfig配置类的Realm。添加缓存的实现,当缓存开启,第一次请求会去访问数据库的数据,后面的请求就不会去访问数据库,而是直接访问缓存当中的数据。
第八章 Shiro连接Mybatis
8.1 数据库脚本
实体类 User
Role
Permission
mapper包UserMapper
RolerMapper
PermissionMapper
service包下LoginUserService
LoginUserServiceImpl
controller包
config包
ShiroConfig
配置文件
启动类
8.2 测试
账号: zhangsan Navicat Premium 8.1.12激活
密码:
今天的文章
Navicat Premium 8.1.12激活(SpringBoot&Shiro入门笔记)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/121751.html