web-flash的登录验证与权限管理

简介

项目地址
该项目是一个很好的Springboot开源项目,从中我们能学习到很多东西,本文将着重讲解web-flash是如何实现后端登录验证与权限管理的
项目采用的方案:JWT + Session + Shiro

  • JWT 这里不细讲,详情见:什么是JWT?(细致讲解),总之它就是一个身份认证的模式,可以让用户标识符存储在客户端,而不用存储在服务端,下文中的 Token 指代 JWT 字符串
  • Session 可以理解为服务端应用的缓存,web-flash 在用户登录成功后,会把用户的角色信息放置在缓存里,项目中使用的是Spring自带的 CacheManager 处理缓存,生产过程中显然不能这样,因为CacheManager没有过期时间的管理,用户信息会被一直保存在应用的缓存中。
  • Shiro 是身份认证和权限服务的框架。

ShiroConfig

注册了自定义Realm,关闭了Shiro自带的Session,因为JWT模式实际上不需要服务端存储Token,所以不需Session。
(cn.enilu.flash.api.config.ShiroConfig#getManager)
web-flash的登录验证与权限管理_第1张图片
但是在本项目中,又手动将用户信息保存在了 Session里面,这个感觉有点别扭,可能是为了加快用户访问速度吧。这里使用的是 CacheManager 处理缓存,没有过期时间。
(cn.enilu.flash.security.ShiroFactroy#shiroUser)
web-flash的登录验证与权限管理_第2张图片
ShiroConfig注册了过滤器并为过滤器设置了URL,所以本项目实现身份验证与Controller层解耦的核心就在于使用了 Filter。
web-flash的登录验证与权限管理_第3张图片
web-flash的登录验证与权限管理_第4张图片

登录验证

  • 登录验证分为两个阶段
    • 登录:用户没有Token,需要通过用户名密码获取Token
    • 身份验证:用户将Token放置在Cookie中,服务端通过Token来验证用户身份
  • Shiro相关的代码
    • ShiroConfig
      • 注册了自定义Realm,关闭了Shiro自带的Session
      • 注册了JwtFilter和SystemLogoutFilter
      • 注册了白名单
      • 添加注解支持
    • JwtFilter
      • preHandle 方法处理跨域问题,不受白名单影响
      • isAccessAllowed 方法是核心校验登录逻辑,校验时会提取Token,将把Token封装后交给Realm处理
    • SystemLogoutFilter
      • 用于处理登出的操作
    • ApiRealm
      • 身份验证
      • 权限验证

登录

本项目中,首次登录做了以下事情:
不依靠Shiro完成的事情:

  • 用户状态验证,用户账号密码比对
    • 在 cn.enilu.flash.api.controller.AccountController#login 中完成
  • 验证通过后,获取用户信息、用户权限,将所有用户信息放置到缓存中(没有过期时间)

依靠Shiro完成的事情:

  • 登录的接口必定在白名单中,所以 JwtFilter 的 isAccessAllowed 身份认证方法不会运行
  • 在 JwtFilter.preHandle 对跨域提供支持

这里其实没啥可说的,其实就是手动对用户的账号密码进行了验证没有依赖于Shiro

身份验证

身份验证工作需要和Controller层解耦,不能写在Controller层,需要依靠Shiro完成

  • 在进入Controller的方法前,会进入 JwtFilter 的 preHandle 和 isAccessAllowed 的方法
    • preHandle 对跨域提供支持
    • isAccessAllowed 会提取请求Cookie中的 Token 将它移交给 Realm 进行处理

web-flash的登录验证与权限管理_第5张图片

  • Realm 的 doGetAuthenticationInfo 方法会进行身份验证
    • 校验用户给的 Token 是否合法
    • 合法后继续下一步

web-flash的登录验证与权限管理_第6张图片

权限验证

本项目采取的是注解形式管理访问权限
1.在登录的时候会把用户所有能访问的 url 一并放入到缓存中
2.Controller层通过 @RequiresPermissions 注解指定访问权限,被项目是依据 URL 来控制访问权限的(URL就是角色)
web-flash的登录验证与权限管理_第7张图片
3.当用户通过身份认证后会进入 ApiRealm.doGetAuthorizationInfo 方法进行权限验证

  • 在权限验证中,会从缓存中获取用户的角色信息,将用户角色交给Shiro
  • Shiro 比对方法标记的角色和用户的角色,如果用户有这个角色则可以进行下一步操作

web-flash的登录验证与权限管理_第8张图片

你可能感兴趣的:(Java,前端,java,spring,boot)