Spring Security 5.1.4 的学习笔记(一)

版权声明:个人原创 https://blog.csdn.net/qq_42459181/article/details/89151650

一、导学


1. 企业级的认证和授权

  其中,用户名+密码登录、手机号+短信认证是通过Spring Security完成的,而第三方(如QQ、微信、微博等社交软件)认证则需要依靠Spring Social,APP的第三方登录还需要Spring Security OAuth的支持。
企业级的认证和授权

2. 代码结构

在这里插入图片描述

二、Spring Security

1. Spring Security核心功能

在这里插入图片描述

2. Spring Security基本原理

在这里插入图片描述
  Spring Security的工作原理是通过一系列的过滤器链来起到作用的。

   绿 \color{green}{绿色块} :绿色块的过滤器有 UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter 等,作用是认证用户身份,每一个过滤器负责处理一种认证方式。
   \color{orange}{橙色块} :橙色块的过滤器只有一个,就是 FilterSecurityInterceptor,它位于过滤器链的最后一环,是外界访问到Controller层之前的最后一道门。它的作用是判断此次请求最终是否可以访问到我们的服务,它的依据是继承了 WebSecurityConfigurerAdapter 的配置类中的 configure 方法里的配置链,如下:
在这里插入图片描述
   \color{blue}{蓝色块} :蓝色过滤器块只有一个,就是 ExceptionTranranslationFilter,它的作用是接收 FilterSecurityInterceptor 过滤器抛出的异常并作出相应的处理。

3. Spring Security 自定义认证逻辑

  1. 自定义认证: 实现用户登录时,根据用户输入的用户名从数据库查询出用户的密码,和用户输入的密码进行比对,若密码正确,可以登录并访问相应的服务,若密码错误,拒绝登录。
    1.1 思路:实现Spring Security的UserDetailsService接口,重写loadUserByUsername方法(将自己的业务逻辑写在该方法中)。实现代码如下:
在这里插入图片描述
    1.2 注:我们可以自己创建一个类来继承Spring Security中的User类,这样的好处在于,我们可以在自己的类里做一些逻辑判断,如:boolean isAccountNonExpired(账户是否过期)、boolean isAccountNonLocked(账户是否冻结)true代表没过期,没冻结
    SecurityUser如下:
在这里插入图片描述
  2. 密码的加密和解密
    2.1 注1:我们可以从我们自己的Spring Security 配置类里来配置密码加密方式(此处为bcrypt)
在这里插入图片描述
    2.2 注2:下面为我们自己的UserController里的代码片段,此处的PasswordEncoder来源于我们注入的BCryptPasswordEncoder,所以我们在注册账号的时候也应该使用该加密方式对密码进行加密,这样才可以使密码加密方式和解密方式保持一致。
在这里插入图片描述
在这里插入图片描述

4. Spring Security 自定义登录页面

  1. 思路第一步:自己创建一个登录页面(此处笔者自己图方便新建了一个简陋的HTML页面,若要前后端分离的请自行设计)。HTML目录结构默认在resource下(不需要额外配置),如下图:
在这里插入图片描述
:红框中的url:/authentication/form,代表了表单登录后会跳转到这个url,而这个url会替代Spring Security默认的登录链接 /login,最终进入到UsernamePasswordAuthenticationFilter过滤器中执行用户名密码的认证流程,源码如下图:
在这里插入图片描述
第二步:修改我们Spring Security 配置类中的configure方法中的配置链,
如下图:
在这里插入图片描述
注1:此处有个小坑,注意要配置 csrf().disable()(跨站请求伪造),否则无法访问到最终请求的接口。
注2: 一个天坑,当我启动imooc-security-demo这个工程时,它引入了imooc-security-browser工程。当我们调用imooc-security-browser里的Mapper接口的方法findByUserName时,程序报错:org.springframework.security.authentication.InternalAuthenticationServiceException: Invalid bound statement (not found): com.imooc.security.browser.mapper.UserMapper.findByUserName
意思是:找不到UserMapper接口里的findByUserName方法,找了半天原因终于找到了答案:我们需要在我们启动的工程imooc-security-demo(没启动imooc-security-browser)里的application.properties文件里配置:mybatis.mapper-locations=mappers/*.xml,因为虽然引入的imooc-security-browser工程里配置了mapper的路径,但是在我们启动工程里也需要配置。

5. Spring Security 自定义登录成功和失败处理

  1. 登录成功处理第一步:自定义AuthSuccessHandler实现Spring Security里的AuthenticationSuccessHandler接口,重写onAuthenticationSuccess方法,代码如下:
在这里插入图片描述
第二步:在Spring Security配置类的configure方法里添加配置,代码如下:
在这里插入图片描述
  2. 登录失败处理:基本逻辑与登录成功处理一样,在此就不赘述了。代码如下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42459181/article/details/89151650