0. 简介

  • Spring Security和Shiro比较。中大型的项目都是使用SpringSecurity做安全框架,小项目使用Shiro比较多,因为它比Spring Security上手更加简单
  • 认证与授权:
    • 认证:验证当前访问系统的是不是本系统的用户,并确认具体是那个用户
    • 授权:经过认证后判断当前用户是否具有权限进行某个操作

1. 快速入门

1.1 准备工作

  • 创建SpringBoot项目,导入相关的依赖
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.0</version>
  </parent>
  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
  </dependencies>

1.2 引入Spring Security

  • 导入Spring Security依赖
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
  </dependency>
  • 导入Security依赖之后,再次访问后端请求时会默认打开一个登录页面
  • 此处默认的用户名(Username)是user,密码(Password)会在后台打印出来一长串字符,登录后就能够正常访问请求
  • Security默认的登出网址/logout

2. 认证

2.1 登录校验流程

2.2 原理

SpringSecurity原理是一个过滤器链,内部包含了提供各种功能的过滤器。

  • UsernamePasswordAuthenticationFilter:负责处理我们在登录页面填写的用户名密码后的登录请求
  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException
  • FilterSecurityInterceptor:负责权限校验的过滤器

认证流程详解:

  • 提交用户名密码
  • 封装Authentication对象,只有用户名密码,没有权限
  • 调用authenticate方法进行认证
  • 调用DaoAuthenticationProvider的authenticate方法进行认证
  • 调用loadUserByUsername方法查询用户
  • 根据用户名查询用户及对应的权限信息
  • 把对应的用户信息包括权限信息封装成UserDetail对象
  • 通过PasswordEncoder对比UserDetails中的密码和Authentication的密码是否一致
  • 如果正确就把UserDetails中的权限信息设置到Authentication对象中
  • 如果上一步返回了Authentication对象就是用SecurityContextHolder.getContext().setAuthentication()方法存储该对象,其他过滤器会通过SecurityContextHolder获取当前用户信息

2.3 解决问题

  • 登录:
    • 自定义登录接口,调用ProviderManager的方法进行认证,认证通过把用户信息存入redis
    • 自定义UserDetailsService,在这个实现类中查询数据库
  • 校验:
    • 定义jwt认证过滤器,获取token,解析token,获取其中的userid,从redis获取用户信息
    • 将用户信息存入SecurityContextHolder

原文地址:http://www.cnblogs.com/zhongshu/p/16931112.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性