关键词:
认证和授权
认证解决“我是谁的问题”
什么是认证?
认证: 验证当前访问系统的是不是本系统的用户,并且要确认具体是哪一个用户
授权解决“我能做什么”的问题
授权:经过认证之后判断当前用户是否有权限进行某个操作;
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、... 查看详情