• SpringSecurity学习(一)


    认证和授权

    认证解决“我是谁的问题”

    什么是认证?

    在这里插入图片描述

    授权解决“我能做什么”的问题

    在这里插入图片描述

    Filer和FilterChain

    Spring Filters

    • 任何Spring Web应用本质上只是一个Servlet;
    • Security Filter在Http请求到达Controller之前过滤每一个传入的Http请求;
      在这里插入图片描述
      在这里插入图片描述

    Filter Chain

    在这里插入图片描述

    常见的内建过滤器

    过滤器名称作用
    BasicAuthenticationFilter如果在请求中找到一个Basic Auth Http头,如果找到,则尝试用该头中的用户名和密码验证用户
    UsernamePasswordAuthenticationFilter若在请求参数或者Post的RequestBody中找到用户名和密码,则尝试用这些值对用户进行身份验证
    DefaultLoginPageGeneratingFiltler默认登录页面生成过滤器,用于生成一个登录页面,若没有明确禁用这个功能,那么就会生成一个登录页面。这就是为什么在启用SpringSecurity时候,会得到一个默认的页面的原因
    DefaultLogoutPageGeneratingFilter若没有禁用该功能,则会生成一个注销页面
    FilterSecurityInterceptor过滤安全拦截器,用于授权逻辑

    SpringSecurity实现认证和授权的底层机制

    Http

    熟悉Http的请求

    在这里插入图片描述

    Http响应

    在这里插入图片描述

    Filter和客户端交互(获取数据返回数据)是通过请求和响应中的字段完成的

    实战

    定制化登录页

    新建工程

    	<dependency>
    	   <groupId>org.webjars</groupId>
    	   <artifactId>webjars-locator-core</artifactId>
    	</dependency>
    	
    	<dependency>
    	   <groupId>org.webjars</groupId>
    	   <artifactId>bootstrap</artifactId>
    	   <version>${bootstrap.version}</version>
    	</dependency>
    	
    	<dependency>
    	   <groupId>org.springframework.boot</groupId>
    	   <artifactId>spring-boot-starter-thymeleaf</artifactId>
    	</dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    依赖类库

    安全配置

    SecurityConfig

    package com.vleus.uaa.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.Customizer;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    /**
     * @author vleus
     * @date 2022年05月17日 22:45
     */
    @EnableWebSecurity(debug = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        /**
         * 走过滤器链
         * @param http
         * @throws Exception
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf(csrf -> csrf.disable())
                    .httpBasic(Customizer.withDefaults())
                    .formLogin(form -> form.loginPage("/login"))
                    .authorizeRequests(req -> req.antMatchers("/api/**").authenticated());
    
        }
    
        /**
         * 设置不启用过滤器链
         * @param web
         * @throws Exception
         */
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().mvcMatchers("/public/**");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    路径映射类

    package com.vleus.uaa.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * 映射url与模板文件路径
     * @author vleus
     * @date 2022年05月22日 20:59
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        /**
         * 将webjar的静态资源加入到映射中
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("/webjars")
                    .resourceChain(false);
            registry.setOrder(1);
    
        }
    
        /**
         * 文件路径和url进行映射
         * @param registry
         */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/login")
                    .setViewName("login");
            registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    CSRF攻击和保护

    在这里插入图片描述

    防止收到CSRF攻击的方式

    CSRF Token在这里插入图片描述

    在响应设置Cookie的SameSite属性

    在这里插入图片描述

    Remember me功能

    • 为解决session过期后用户的直接访问问题;
    • Spring Security提供开箱即用的配置 rememberMe;
    • 原理:使用Cookie存储用户名,过期时间,以及一个Hash;

    Hash:md5(用户名+过期时间+密码+key)

    登录成功和失败后的处理

    • 登录成功后的处理:AuthenticationSuccessHandler;
    • 登录失败后的处理:AuthenticationFailureHandler;
    • 退出登录成功后的处理:LogoutSuccessHandler;
  • 相关阅读:
    R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化分组散点图(scatter plot)、设置add参数为每个分组添加回归线
    .NET C#基础(6):命名空间 - 组织代码的利器
    Device Partner 平台合作伙伴认证和数据安全保护
    vben-admin 学习记录
    kafka 磁盘扩容与数据均衡实在操作讲解
    r语言tidyverse教程:5 字符串处理stringr
    k8s 部署专业版 Thingsboard 集群
    【数据库与事务系列】多数据源切换
    关于相机景深学习笔记
    Vue生命周期
  • 原文地址:https://blog.csdn.net/cjl_xupt/article/details/122394416