spring|SpringBoot+Shiro+Jwt实现登录认证( 二 )

  • 将ssm的整合的配置使用java代码方式在springBoot中写一遍
  • 使用官方提供的start
  • 2.1 使用start整合springBoot
    pom.xml

    application.properties

    创建ShiroConfig.java进行一些简单的配置

    创建自定义的Realm

    2.2 不使用starter

    编写 Shiro 的配置类:ShiroConfig
    将 Shiro 的配置信息(spring-shiro.xml 和 spring-web.xml)以 Java 代码配置的形式改写:

    编写 Controller
    与 Shiro 和 SSM 的整合一样 。 略
    编写 Thymeleaf 页面

    3. SpringBoot整合Jwt3.1 依赖

    3.2 代码
    1、创建JwtUtil

    解析:
    1.在创建JwtUtil对象的时候需要传入几个数值
    1.这个用户 , 用来生成秘钥
    2.这个加密算法 , 用来加密生成jwt
    2.通过jwt数据获取用户信息的方法(decode())
    3.判断jwt是否存在或者过期的方法
    4.最后是测试方法
    2、创建一个Controller
    1.登录的Controller
    1.获取username和password , 进行与数据库的校验 , 校验成功执行下一步 , 失败直接返回
    2.使用创建JwtUtil对象 , 传入username和需要使用的加密算法
    3.创建需要加在载荷中的一些基本信息的一个map对象
    4.创建jwt数据 , 传入username , 保存时间 , 以及基本信息的map对象
    2.校验Controller
    1.获取前台传入的Jwt数据
    2.使用JWTUtil中的isVerify进行该jwt数据有效的校验
    4. SpringBoot+Shiro+Jwt1.由于需要对shiro的SecurityManager进行设置 , 所以不能使用shiro-spring-boot-starter进行与springboot的整合 , 只能使用spring-shiro

    2.由于需要实现无状态的web , 所以使用不到Shiro的Session功能 , 严谨点就是将其关闭

    这样如果调用getSession()方法会抛出异常
    4.1 流程
    1. 用户请求 , 不携带token , 就在JwtFilter处抛出异常/返回没有登录 , 让它去登陆
    2. 用户请求 , 携带token , 就到JwtFilter中获取jwt , 封装成JwtToken对象 。 然后使用JwtRealm进行认证
    3. 在JwtRealm中进行认证判断这个token是否有效 , 也就是
    执行流程:1. 客户端发起请求 , shiro的过滤器生效 , 判断是否是login或logout的请求<br/>    如果是就直接执行请求<br/>    如果不是就进入JwtFilter2. JwtFilter执行流程    1. 获取header是否有\"Authorization\"的键 , 有就获取 , 没有就抛出异常    2. 将获取的jwt字符串封装在创建的JwtToken中 , 使用subject执行login()方法进行校验 。 这个方法会调用创建的JwtRealm    3. 执行JwtRealm中的认证方法 , 使用`jwtUtil.isVerify(jwt)`判断是否登录过    4. 返回true就使基础执行下去

    4.2 快速开始
    0. JwtDeafultSubjectFactory

    1. 创建JwtUtil
    这个一般是固定的写法 , 其中写了大量注释

    2. 创建JwtFilter
    也就是在Shiro的拦截器中多加一个 , 等下需要在配置文件中注册这个过滤器

    3. 创建JwtToken
    其中封装了需要传递的jwt字符串

    4. JwtRealm创建判断jwt是否有效的认证方式的Realm

    5. ShiroConfig配置一些信息
    1. 因为不适用Session , 所以为了防止会调用getSession()方法而产生错误 , 所以默认调用自定义的Subject方法
    2. 一些修改 , 关闭SHiroDao等
    3. 注册JwtFilter

    6. 测试
    4.3 授权方面的信息
    在JwtRealm中的授权部分 , 可以使用JwtUtil.decode(jwt).get(\"username\")获取到username , 使用username去数据库中查找到对应的权限 , 然后将权限赋值给这个用户就可以实现权限的认证了