Navicat Premium 8.1.12激活(SpringBoot&Shiro入门笔记)

Navicat Premium 8.1.12激活(SpringBoot&Shiro入门笔记)

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, SecurityManagerRealms
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项目

  1. 完整的pom.xml文件如下

  1. 创建ShiroConfig.java

  1. 创建MyRealm.java

  1. 定义 login.html

  1. 定义 success.html

  1. 定义 noPermission.html

  1. 定义 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主体实例去实现
Navicat Premium 8.1.12激活(SpringBoot&Shiro入门笔记)

2.通过注解的方式
@RequiresAuthentication:使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在已经过认证。
@RequiresGuest:使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是gust身份,不需要经过认证或者在原先的session中存在记录。
@RequiresPermissions:当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。
@RequiresRoles:当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。
@RequiresUser:当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。


  1. 通过页面方式
    在这里插入图片描述

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

(0)
编程小号编程小号
上一篇 2024-07-06 20:46
下一篇 2024-07-06 21:11

相关推荐