【SpringSecurity】学习笔记(一)

news2024/12/28 20:55:48

学习笔记

  • 一、SpringSecurity 简介
  • 二、创建测试项目
    • 2.1、引入依赖
    • 2.2、测试
  • 三、SpringSecurity基本原理
    • 3.1、过滤器链
      • 3.1.1、FilterSecurityInterceptor
      • 3.1.2、ExceptionTranslationFilter
      • 3.1.3、UsernamePasswordAuthenticationFilter
    • 3.2、过滤器加载过程
    • 3.3、两个重要的接口
      • 3.3.1、UserDetailsService
      • 3.3.2、PasswordEncoder
  • 四、用户认证
    • 4.1、方法一:配置文件
    • 4.2、方法二:配置类
    • 4.3、方法三:自定义编写实现类

一、SpringSecurity 简介

Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。

Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 Spring Security 重要核心功能。

SpringSecurity 特点:

  • 和 Spring 无缝整合。
  • 全面的权限控制。
  • 专门为 Web 开发而设计。
  • 旧版本不能脱离 Web 环境使用。
  • 新版本对整个框架进行了分层抽取,分成了核心模块和 Web 模块。单独引入核心模块就可以脱离 Web 环境。
  • 重量级。

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security。

因此,一般来说,常见的安全管理技术栈的组合是这样的:(只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行的)

  • SSM + Shiro
  • Spring Boot/Spring Cloud + Spring Security

二、创建测试项目

2.1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

编写controller

@GetMapping("/hello")
public String hello() {
    return "hello security";
}

2.2、测试

访问http://localhost:8080/test/hello
就会需要认证
在这里插入图片描述

默认用户名:user
密码在控制台会输出
在这里插入图片描述

三、SpringSecurity基本原理

3.1、过滤器链

SpringSecurity本质是一个过滤器链

org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
org.springframework.security.web.context.SecurityContextPersistenceFilter 
org.springframework.security.web.header.HeaderWriterFilter
org.springframework.security.web.csrf.CsrfFilter
org.springframework.security.web.authentication.logout.LogoutFilter 
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter 
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
org.springframework.security.web.savedrequest.RequestCacheAwareFilter
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
org.springframework.security.web.authentication.AnonymousAuthenticationFilter 
org.springframework.security.web.session.SessionManagementFilter 
org.springframework.security.web.access.ExceptionTranslationFilter 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor

SpringSecurity过滤器链中有几个比较重要的过滤器

3.1.1、FilterSecurityInterceptor

是一个方法级的权限过滤器, 基本位于过滤链的最底部

源码getSecureObjectClass部分:

	//此处说明 在这个之前还会有过滤器 当之前的过滤器放行了才会进行到这一步
	//super.beforeInvocation(fi)表示查看之前的 filter 是否通过
	InterceptorStatusToken token = super.beforeInvocation(filterInvocation);
	
	try {
		//表示真正的调用后台的服务
		filterInvocation.getChain().doFilter(filterInvocation.getRequest(), filterInvocation.getResponse());
	} finally {
		super.finallyInvocation(token);
	}
	
	super.afterInvocation(token, (Object)null);

3.1.2、ExceptionTranslationFilter

是个异常过滤器,用来处理在认证授权过程中抛出的异常

3.1.3、UsernamePasswordAuthenticationFilter

对/login 的 POST 请求做拦截,校验表单中用户名,密码

3.2、过滤器加载过程

  1. 使用SpringSecurity配置过滤器 DelegatingFilterProxy(在SpringBoot中已经自动配置了)
  2. 在FilterChainProxy.class中把配置的过滤器加载到过滤器链中

3.3、两个重要的接口

3.3.1、UserDetailsService

当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。
而在实际项目中账号和密码都是从数据库中查询出来的。
所以我们要通过自定义逻辑控制认证逻辑。

如果需要自定义逻辑时,只需要实现UserDetailsService,接口即可

步骤:

  1. 创建类继承UsernamePasswordAuthenticationFilter,重写三个方法
  2. 创建类实现UserDetailservice 编写查询数据过程,返回User对象,这个User对象是安全框架提供对象

3.3.2、PasswordEncoder

// 表示把参数按照特定的解析规则进行解析
String encode(CharSequence rawPassword);
//表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。
//如果密码匹配,则返回 true;如果不匹配,则返回 false。
//第一个参数表示需要被解析的密码。第二个参数表示存储的密码。
boolean matches(CharSequence rawPassword, String encodedPassword);
// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回false。默认返回 false。
default boolean upgradeEncoding(String encodedPassword) {
	return false;
}

四、用户认证

4.1、方法一:配置文件

spring.security.user.name=admin
spring.security.user.password=admin

4.2、方法二:配置类

使用 方法二 时 方法一 失效

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()//认证信息存储到内存中
            .withUser("lucy")//用户名
            .password(new BCryptPasswordEncoder().encode("123"))//用户密码(加密)
            .roles("admin");//每个用户都配置角色(不能为空)
    }

    @Bean
    //configure需要用到加密方式但默认没有 需要在容器的创建一个
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
}

4.3、方法三:自定义编写实现类

config:

@Configuration
public class SecurityConfigTest extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }
    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
}

Service:

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        List<GrantedAuthority> auths =
                AuthorityUtils.commaSeparatedStringToAuthorityList("super");
        //TODO :从查询数据库返回users对象,得到用户名和密码,返回
        return new User("mary", new BCryptPasswordEncoder().encode("123"), auths);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看完这篇,保证你学网络安全一帆风顺!

网络安全入门很难吗&#xff1f;总有人抱怨黑客入门太难了&#xff0c;然后仔细了解之后却发现&#xff0c;觉得难是因为看的视频教程都不是配套的&#xff0c;都是这里学一点、那里学一点&#xff0c;脑子里连基本的框架都没有。更过分的是&#xff0c;有的人学了好几个月&…

uniapp - 微信小程序端引入 Echarts 图表及使用详细教程,简单快速的解决方案(拒绝复杂的过程,附带详细的使用示例保姆级教程)

效果图 现在各种平台的文章都太乱了,基本上实测无效。。。 帮你在uniapp开发中,微信小程序平台端使用 echats 图表的详细教程,快速并且简单轻松搞定。 下面是最后的运行结果,随便用的一个图表进行展示,图表更多用法详见文档!

用正则去掉所有HTML标签,保留指定标签

保留单个&#xff0c;如保留img标签&#xff1a;str.replace(/]*>/ig,) 保留多个&#xff0c;如保留strong、em、p、u标签&#xff1a;str.replace(/]*>/ig,) 清除所有标签&#xff0c;就是去掉保留指定标签的部分了&#xff1a;str.replace(/]*>/g, ) replace 正则匹…

(学习日记)2023.4.18

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

java基础——迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类

迭代器&#xff0c;数据结构,List,Set ,TreeSet集合,Collections工具类 第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中&#xff0c;经常需要遍历集合中的所有元素。针对这种需求&#xff0c;JDK专门提供了一个接口java.util.Iterator。 想要遍历Collection集合&…

【Leetcode】最小栈、栈的压入、弹出序列、逆波兰表达式求值

文章目录最小栈栈的压入、弹出序列逆波兰表达式求值最小栈 题目要求是在常数时间内检索到最小的元素的栈&#xff0c;思路是每当栈中存放一个更小的数据时&#xff0c;就将它入栈&#xff0c;相同的值也要入栈。 class MinStack { public:MinStack() {}//对自定义类型&#xf…

梭哈大模型,阿里云成了跟风者?

伴随AI大模型潘多拉魔盒打开&#xff0c;云市场GameChanger已到来。对阿里云这个昔日老大哥而言&#xff0c;从“领先者”变为“跟风者”&#xff0c;是否还有机会去重塑行业规则&#xff1f; 这可能是张勇全面掌舵阿里巴巴7年以来&#xff0c;事关未来最重要的一次“梭哈”。 …

《ChatGPT实用指南》(精编版)重磅发布,全网免费分享,快上车,别掉队

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 据上次3月18号发布的V1.8版&#xff0c;已经过去十天&#xff0c;这期间AI领域发生了很多重大变化。 因此&#xff0c;我们对《ChatGPT实用指南》进行了重大改版&#xff0c;增加了大量实用的操作和详细的讲解&…

【开懂C++】引用与关键字auto

目录 一.引用1.引用的概念2.引用的使用和问题3.引用与指针的比较二.关键字auto 一.引用 1.引用的概念 引用就是给一个已经存在的变量取一个别名&#xff0c;与变量共用一段内存空间。注意引用的类型必须和变量类型相同&#xff0c;来演示下引用如何使用。 #include <iost…

2.1.2事件驱动reactor的原理与实现

先来了解一下epoll select(maxfd, rfds, wfds, efds, timeout);poll(pfds, length, timeout);#include <sys/epoll.h> int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event…

记录一次mysql死锁日志分析

记录一次mysql死锁-CSDN博客 MySQL死锁日志的查看和分析_mysql死锁日志解读_lkforce的博客-CSDN博客 此文承接以上两篇文章&#xff0c;文章1原创记录&#xff0c;文章2转载分析 一&#xff0c;死锁sql update tt_task SET navigation_distance ?, plan_arri…

决策树相关知识点

为什么id3和c4.5采用多叉树而cart采用二叉树&#xff1f; ID3 和 C4.5 采用的多叉树虽然在对训练样本集的学习中可以尽可能多地挖掘信息&#xff0c;但是其生成的决策树分支、规模都比较大&#xff0c;训练特别慢&#xff0c;CART 算法的二分法可以简化决策树的规模&#xff0…

Mybatis框架源码笔记(十一)之Spring整合mybatis演示与整合原理解析

1 Spring框架整合Mybatis示例 1.1 创建演示项目 1.2 项目目录结构 1.3 依赖配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

d2l机器翻译数据集

着重讲解一下机器翻译数据集的文件处理&#xff0c;以及最终返回了什么 目录 1.载入文件 2.文本预处理 3.词表 4.集成封装 5.总结返回值 1.载入文件 #save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5) #save def read…

AJAX-0基础第一天入门

AJAX-第一天入门 学习目标 掌握 axios 相关参数&#xff0c;从服务器获取并解析展示数据掌握接口文档的查看和使用掌握在浏览器的 network 面板中查看请求和响应的内容了解请求和响应报文的组成部分 01.AJAX 概念和 axios 使用 目标 了解 AJAX 概念并掌握 axios 库基本使用…

生信刷题之ROSALIND——Part 2

目录 1、Counting Point MutationsProblemSample DatasetSample OutputCodeOutput 2、Mendels First LawProblemSample DatasetSample OutputCodeOutput 3、Translating RNA into ProteinProblemSample DatasetSample OutputCodeOutput 4、Finding a Motif in DNAProblemSample…

C/C++每日一练(20230415)

目录 1. 交错字符串 &#x1f31f;&#x1f31f; 2. 最短回文串 &#x1f31f;&#x1f31f; 3. 分段函数计算 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 交错字符串 给定…

【数据库】MySQL的增删改查

目录 1.CRUD 2.新增数据 2.1单行数据全列插入 2.2多行数据指定列插入 3.查询数据 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.4别名 3.5去重DISTINCT 3.6排序ORDER BY 3.7 条件查询&#xff1a;WHERE 3.8 分页查询&#xff1a;LIMIT 4.修改数据 5.删除数…

Flutter开发中的线程与事件队列,如何实现高效优化?

Flutter 中线程简要介绍&#xff1a; 主 UI 线程&#xff1a; Flutter 的主 UI 线程通常称为 “UI Isolate”&#xff0c;它是单线程的&#xff0c;负责处理用户界面的渲染和响应用户输入。在主 UI 线程中运行的代码主要包括 Flutter 应用的 UI 组件构建、布局、绘制等操作&a…

基于DSP+FPGA的机载雷达伺服控制系统(二)电源仿真

板级电源分配网络的分析与仿真在硬件电路设计中&#xff0c;电源系统的设计是关键步骤之一&#xff0c;良好的电源系统为电路板 上各种信号的传输提供了保障。本章将研究电源完整性的相关问题&#xff0c;并提出一系列改 进电源质量的措施。 3.1 电源完整性 电源完整性&#xf…