springsecurity学习(代码片段)

三笠·阿卡曼 三笠·阿卡曼     2022-11-11     213

关键词:

认证和授权

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

什么是认证?


认证: 验证当前访问系统的是不是本系统的用户,并且要确认具体是哪一个用户

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


授权:经过认证之后判断当前用户是否有权限进行某个操作;

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>

依赖类库

安全配置

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/**");
    

路径映射类

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);
    

CSRF攻击和保护

防止收到CSRF攻击的方式

CSRF Token

在响应设置Cookie的SameSite属性

Remember me功能

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

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

登录成功和失败后的处理

  • 登录成功后的处理:AuthenticationSuccessHandler;
  • 登录失败后的处理:AuthenticationFailureHandler;
  • 退出登录成功后的处理:LogoutSuccessHandler;

springsecurity学习——快速开始(代码片段)

前言SpringSecurity是目前Java后台管理系统中使用最常见的安全认证框架之一。它的上手没Shiro那么直观。Shiro是可以直接开个javaSE应用验证的,但SpringSecurity基本要求和web关联起来。刚开始看甚至不知道从何入手。最近决定静下... 查看详情

springsecurity学习总结(代码片段)

这几天一直在学习springsecurity的相关知识.逛各大论坛,看相关api与教学视频,获益良多!简介SpringSecurity是为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了完整的安全性解决方案,可以在Web... 查看详情

springsecurity学习二(代码片段)

doc:https://docs.spring.io/spring-security/site/docs/基于表单的认证(个性化认证流程):一、自定义登录页面1、在securityConfigy配置类中的config方法中添加调用链方法@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsExceptionhttp.formLogin()/ 查看详情

springsecurity学习——密码加密(代码片段)

前言上一篇文章我们实现了从数据库读取用户名密码到SpringSecurity中,并验证登录成功。不过密码的形式有点奇怪,这篇文章我们研究一下密码加密和比对的问题。SpringSecurity的密码加密和比对密码编码器的使用SpringSecurit... 查看详情

springsecurity学习(代码片段)

认证和授权认证解决“我是谁的问题”什么是认证?认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪一个用户授权解决“我能做什么”的问题授权:经过认证之后判断当前用户是否有权限进... 查看详情

springsecurity学习——快速开始(代码片段)

前言SpringSecurity是目前Java后台管理系统中使用最常见的安全认证框架之一。它的上手没Shiro那么直观。Shiro是可以直接开个javaSE应用验证的,但SpringSecurity基本要求和web关联起来。刚开始看甚至不知道从何入手。最近决定静下... 查看详情

springsecurity学习——使用数据库保存密码(代码片段)

前言上一篇文章我们已经快速搭起SpringSecurity应用。我们使用的是默认的用户名密码。通常项目中我们使用数据库保存密码,并且数据库的密码是加密保存的。如何做到呢,是这篇文章的重点。引入数据库新建数据库表我... 查看详情

springsecurity-用户动态授权及动态角色权限(代码片段)

一、SpringSecurity动态授权上篇文章我们介绍了SpringSecurity的动态认证,上篇文章就说了SpringSecurity的两大主要功能就是认证和授权,既然认证以及学习了,那本篇文章一起学习了SpringSecurity的动态授权。上篇文章地址... 查看详情

轻松上手springsecurity,oauth,jwt(代码片段)

目录学习目标一.SpringSecurity1.SpringSecurity简介及快速入门<1>.SpringSecurity简介<2>.SpringSecurity快速入门2.SpringSecurity基本原理<1>.UserDetailsService详解<2>.PasswordEncoder密码解析器详解3.SpringSecurity自定义 查看详情

springsecurity学习——密码加密(代码片段)

前言上一篇文章我们实现了从数据库读取用户名密码到SpringSecurity中,并验证登录成功。不过密码的形式有点奇怪,这篇文章我们研究一下密码加密和比对的问题。SpringSecurity的密码加密和比对密码编码器的使用SpringSecurit... 查看详情

框架学习smpe后端框架-springsecurity(代码片段)

目录SpringSecurity1.SecurityContextHolder工具类2.SpringSecurity中将使用username和password封装成Authentication的实现类UsernamePasswordAuthenticationToken,声明为了authenticationToken2.1整个过程的讲解2.1.1UsernamePasswordAuthenticationFilter类的说明2.1.2封装用... 查看详情

springboot集成springsecurity——入门程序(代码片段)

因为项目需要,第一次接触SpringSecurity,早就听闻SpringSecurity功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请放心食用)本篇文章环境:SpringBoot2.0+Mybatis+SpringSecurit... 查看详情

springsecurity学习(代码片段)

...,那么就会生成一个登录页面。这就是为什么在启用SpringSecurity时候,会得到 查看详情

springsecurity-用户动态授权及动态角色权限(代码片段)

一、SpringSecurity动态授权上篇文章我们介绍了SpringSecurity的动态认证,上篇文章就说了SpringSecurity的两大主要功能就是认证和授权,既然认证以及学习了,那本篇文章一起学习了SpringSecurity的动态授权。上篇文章地址... 查看详情

安全框架springsecurity是什么?如何理解springsecurity的权限管理?(代码片段)

大家好,我是卷心菜。本篇主要讲解SpringSecurity的基本介绍和架构分析,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。文章目录一、前言二、SpringSecurity简介三、权限管理1、什么是权限管理2、什么是认... 查看详情

springsecurity-webflux环境下实现用户动态认证(代码片段)

一、SpringSecurity-WebFlux上篇文章我们讲解了SpringSecurity整合JWT使用Token的方式认证授权,但是从前面的学习中应该可以发现,我们是在SpringMVC环境下实现的,所写的过滤器都是基于Servlet的。我们也知道Spring很早就退出了... 查看详情

浅谈springsecurity框架(代码片段)

前言SpringSecurity作为一款安全框架,和Shiro一样,核心功能也是认证和授权。而对于web端的认证和授权,其本质也是通过各种Filter过滤器进行实现。本篇博文简单记录一下SpringSecurity为我们提供了哪些功能,以及Spri... 查看详情

springsecurity(新版本)实现权限认证与授权(代码片段)

学习新版SpringSecurity详细配置一、SpringSecurity介绍1、SpringSecurity简介2、历史3、同款产品对比3.1、SpringSecurity3.2、Shiro二、SpringSecurity实现权限1、SpringSecurity入门1.1添加依赖1.2、启动项目测试2、用户认证2.1、用户认证核心组件2.2、... 查看详情