自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Shiro框架02

jdbcRealm

  • 博客(74)
  • 收藏
  • 关注

原创 第21章 OAuth2LoginAuthenticationWebFilter 之AuthenticationSuccessHandler

当认证成功后(获取用户信息),会进行认证成功回调。我们可以配置自定义的Handler来处理认证成功后业务代码。

2022-08-21 17:03:43 1174 1

原创 第20章 OAuth2LoginAuthenticationWebFilter 之ReactiveAuthenticationManager认证授权管理器

在上一篇我们分析了如何把请求转换成 Authentication 认证信息对象。接下来,我们将分析ReactiveAuthenticationManager如何来认证授权,它内部的工作流程是如何的。

2022-08-21 17:00:04 2621

原创 第19章 OAuth2LoginAuthenticationWebFilter 之ServerAuthenticationConverter

当然,如果我们不想使用默认的实现类,我们也可以自己单独配置。return http . csrf() . disable() . oauth2Login(oauth2Login -> oauth2Login // 传入自定义的 ServerAuthenticationConverter 实现类 . authenticationConverter(. . .) . build();} }...

2022-08-14 16:02:09 1101 1

原创 第18章 OAuth2LoginAuthenticationWebFilter 之请求匹配器ServerWebExchangeMatcher

在上一篇我们分析到了OAuth2LoginAuthentiationWebFilter会拦截匹配成功的请求路径。哪些请求路径会被拦截、如何去自定义要拦截的请求路径。这两个问题将是今天的主题。

2022-07-18 17:59:40 902 2

原创 第17章 OAuth2LoginAuthenticationWebFilter 源码解析

SpringBoot OAuth2 Client的授权核心由两个过滤器来实现:OAuth2LoginAuthenticationWebFilter过滤器就是今天主要分析的主角。OAuth2LoginAuthenticationWebFilter过滤器依赖很多类:实现了如下功能:以下思维导图主要描述OAuth2LoginAuthenticatioinWebFilter依赖的类,方便我们能够对其清晰直观的了解。OAuth2LoginAuthticationWebFilter过滤器继承了 Authenticat

2022-07-10 10:43:46 685

原创 第16章 OAuth2AuthorizationRequestRedirectWebFilter源码解析

OAuth2AuthorizationRequestRedirectWebFilter 过滤器源码分析

2022-07-03 09:52:18 600

原创 第15章 Spring Security OAuth2 初始

Spring Security OAuth Login 认证授权

2022-07-02 16:13:36 1055

原创 第14章 Spring的MySQLMaxValueIncrementer深入分析与扩展

取号这种需求在开发中有时候很常见,例如:银行办理业务时候就需求取号。那如何去实现一种高效、可靠的取号呢?对于取号这种需求,我们首先需要保证取号不能重复,也就是说保证分布式系统取号也不能重复。有可能我们会首先想到基于Redis的incr命令可以高效、快速实现,但是缺点是当Redis宕机后,有可能造成数据丢失,导致取号重复。另一种方案就是基于MySQL实现,也就是今天的主题 MySQLMaxValueIncrementer。源码分析创建 MySQLMaxValueIncrementer 对象时,需要指定表

2022-04-23 11:03:53 796

原创 第13章 Spring的@Autowired注解深入分析

@Autowired 注解支持属性注入、构造函数、方法注入。注入点也支持普通对象注入、数组、List、Map、泛型对象注入。@Configuration@ComponentScanpublic class AccountConfig4 { @Bean public FileService fileService() { return new FileService(){}; } @Bean public FileService fileService2() { return ne

2022-04-18 21:56:04 315

原创 第12章 Spring的Import注解深入分析

Import注解用来导入Bean对象到Spring容器中,最常用就是导入被 @Configuration 标识的配置类。@Import 注解允许导入 @Configuration 类、ImportSelector、ImportBeanDefinitionRegister的实现类。使用导入普通类定义 Car 类,然后通过 @Import 注解把 Car 导入Spring容器中,无须手动注入它。public class Car { }定义配置类,使用 @Import 注解标识。注意:即时配置类

2022-04-04 15:46:26 485

原创 第11章 MetadataReader使用

在上一章中,看到了 MetadataReader 的身影,这一章就来学习 MetadataReader 方法,以便以后可以借助它快速地开发。MetadataReaderMetadataReader 是用来读取 class 的元数据的类。public interface MetadataReader { // Return the resource reference for the class file. Resource getResource(); // Read basic

2022-03-27 10:47:59 1203 1

原创 第10章 Spring的ComponentScan注解深入分析

第16章 Spring的ComponentScan注解深入分析@ComponentScan 注解和 @Configuration 注解结合使用,默认是用来扫描指定包下的被@Compoent 注解的类。@ComponentScan 注解有一些属性,如下所示。@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public @interfac

2022-03-27 10:46:10 271

原创 CompletableFuture 异步编程

CompletableFuture 异步编程Java8 新增一个类 CompletableFuture,用来支持流式异步编程。创建任务CompletableFuture 提供一下API用来执行异步任务。static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);static <U> CompletableFuture<U> supplyAsync(Supplier&

2022-03-26 14:30:53 936

原创 SpringBoot Validator

在开发中,往往需要对应前端穿过来的参数进行校验,有时候会显得参数校验过于臃肿,但是又不得不做。这里引入 Hibernate Validator ,它支持属性、字段、返回值、方法参数、类级别的校验,而且SpringBoot可以很轻松集成。Maven<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation

2022-03-21 22:44:34 1293

原创 第一章 MinIO介绍与安装

第一章 MinIO介绍与安装MinIO是一个高性能对象存储方案,支持分布式部署,它的API可以与 Amazon S3 云存储服务兼容。安装MinIO为了简单的学习 MinIO,这里通过Docker的方式来安装。对于生产环境,官方推荐使用集群的方式来安装。docker run \ -p 9000:9000 \ -p 9001:9001 \ -e "MINIO_ROOT_USER=minio" \ -e "MINIO_ROOT_PASSWORD=minio12345" \ quay.

2022-03-20 11:55:35 3464

原创 第8章 Spring加载Bean流程以及常用扩展点

加载Bean流程这里画了Bean加载简版流程图。主要是为了搞清楚几个扩展加载顺序。常用扩展点1.AwareAware 接口都是用来感知的。BeanNameAware 用来感知Bean对象被容器管理的beanNameBeanClassLoaderAware 可以给Bean对象设置类加载器BeanFactoryAware 给Bean对象设置BeanFacory对象Spring 在初始化Bean对象时,对Aware接口的处理private void invokeAwareMethods(Str

2022-03-06 15:18:44 474

原创 第7章 Spring的注解@PropertySource 使用与深入理解

@PropertySource 注解用来增加 PropertySource 到 Spring 的 Environment 中。和 @Configuration 注解结合使用。使用例子给一个指定文件 app.properties 包含一个键值对 bean.name=java.lang.String。@PropertySource 会把 app.properties 放入到 Environment 里。@Configuration@PropertySource("classpath:/app.prope

2022-02-19 17:46:29 2070

原创 第6章 Spring的工具类AnnotationMetadata

Spring提供许多工具类,AnnotationMetadata 就是其中之一。AnnotationMetadata 是用来访问指定类上的注解,处理注解非常方便。本章节就是来学习一些API。前置条件maven需要引入Spring、assertj-core包。代码public class AnnotationMetadataTest { @Test void standardAnnotationMetadata() { AnnotationMetadata metad

2022-02-18 10:28:30 2310

原创 第5章 仿写Spring的定时任务Task

第5章 仿写Spring的定时任务Task在第4章 Spring 定时任务 分析Spring实现定时任务的源码。本章节是自定义注解 @EnableScheduling2、@Scheduled2 来实现定时任务的功能。本章节主要照着Spring源码进行仿写,省略一些复杂的步骤,主要用来加深源码的理解。考虑到代码比较多,直接贴上GitHub地址:task-joy。希望喜欢的小伙伴给一些赞????效果编写启动类,使用@EnableScheduling2 注解@SpringBootApplication

2022-02-16 15:36:44 137

原创 第4章 Spring 定时任务

在开发系统时,有时候我们会碰到一些需求,需要由定时任务来完成。SpringBoot开启定时任务很简单。由 @EnableScheduling 和 @Scheduled 来完成。启动@SpringBootApplication@EnableSchedulingpublic class DatApplication { public static void main(String[] args) { SpringApplication.run(DatApplication.cla

2022-02-14 16:26:14 488

原创 第7章 Pub/Sub订阅与发布

Redis也支持简单的订阅与发布。订阅与发布可用于系统解耦。Redis订阅分为两种:1)按channel名订阅;2)按pattern订阅。Redis的Pub/Sub和它的数据库没有关系,没有key space。这就意味,我们可以在db10发布消息,在db1也能订阅消息。Channel订阅SUBSCRIBE channel [channel …]订阅指定的channel。一旦客户端订阅了channel,客户端就进入了订阅状态。它将不能发送除了SUBSCRIBE, PSUBSCRIBE, UNS

2021-11-30 19:27:18 551

原创 第6章 Pipeline管道

Redis的pipeline管道用于批量读取或写入操作,减少网络开销,提供执行效率。Pipeline大致原理是把多个命令打包,然后一起发送到Redis服务器执行。pipeline的局限性有两点:Redis服务器是用队列来存储执行的命令,而队列是放在内存里的,所以一次性不能发送太多的命令,容易导致内存溢出,可分批次导入。pipeline都是打包一组命令,最后一次性执行。所以执行的命令最好不能有依赖性。例如,某个命令插入成功后,才接着后续操作。批量写@Testpublic void testPip

2021-11-30 19:22:58 665

原创 第5章 Redis的Hash类型

hash的数据结构类似于Java里的类。key可以类似于类名添加域HSET key field value [field value …]往key中添加一个field,并给field填充value。返回值:返回fields的数量HashMap<String, String> fields = new HashMap<>();fields.put("id", "10001");fields.put("name", "tom");fields.put("age",

2021-11-28 16:27:33 324

原创 第4章 Redis的SortedSets类型

sortedSet是带有顺序的set。跟sets一样,member是唯一的。添加ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score memner]添加一个或多个score/member是键值对。如果member以存在,则更新它的score并且这个member会再右边再次被插入,确保正确的顺序。XX:仅更新以存在的memberNX:仅新增member,这个member是原先不存在的LT:仅更新存在并且新的score小于原来的sco

2021-11-28 16:26:57 199

原创 第3章 Redis的Sets类型

SetsSet类似于HashSet的数据结构。元素不可重复。添加SADD key member [member …]添加元素到集合中。如果元素已经存在集合中,则忽略返回值:返回集合中元素的数量Long size = resource.sadd(key1, "a", "b", "d");统计数量SCARD key返回集合中元素的个数。cardinality-----数量返回值:key存在,返回集合的元素个数​ key不存在,返回0Lon

2021-11-28 16:25:36 146

原创 第2章 Redis的Lists类型

第2章 ListsList的数据结构类似于双端链表。Redis中L表示链表的头,R表示链表尾部。存放头插法LPUSH key element [element …]向指定的链表插入多个值。L表示插入的方向是头插法。如果key不存在,创建空链表再插入;存在则追加。返回值:链表长度example:LPUSH mykey a b c链表大致结构:c - > b -> aLong size = resource.lpush(key, "a", "b", "c");LPU

2021-11-28 16:24:45 371

原创 第1章 Redis的Strings类型

第1章 Strings类型存放相关APISET key value [EX seconds|PX milliseconds] [NX|XX]EX:指定多少秒过期PX:指定多少毫秒过期NX:指定key不存在时,才存放;否则,不存放XX:指定key存在时,才覆盖;否则,不存放String ok = jedis.set(key, value, SetParams.setParams().ex(2));APPEND key value如果key存在,则追加值;key不存在,直接存放

2021-11-28 16:23:21 70

原创 第3章 ApplicationRunner 和 CommandLineRunner 服务启动加载配置

第3章 ApplicationRunner 和 CommandLineRunner 服务启动加载配置SpringBoot 提供了 ApplicationRunner 和 CommandLineRunner 接口,可以用来在服务器启动后,自定义去加载一些配置。例如,我们可以在服务启动后,加载数据库数据等。使用我们可以定义多个 ApplicationRunner 或 CommandLineRunner 的实现类。如果想要控制执行的顺序,可以加 @Order() 进行控制。@Componentpubl

2021-11-15 16:53:18 743

原创 第2章 Spring 订阅与发布的原理

目录注册事件广播器注册事件监听器加载事件监听器发布事件处理事件在之前了解Spring的订阅与发布是如何使用以后,我们来看Spring是如何实现订阅与发布。Spring的订阅与发布主要分为四个模块:注册事件广播器 ApplicationEventMulticaster注册事件监听器 ApplicationEventListener发布事件处理监听事件注册事件广播器Spring在注册事件广播器时,会调用 AbstractApplicationContext#refresh 方法。这个方法是用来

2021-11-07 17:50:37 587

原创 第1章 Spring 订阅与发布

Spring 的订阅与发布事件功能是非常有用的。要使用Spring的订阅与发布事件功能,需要以下步骤:在Spring 4.2版本之前,自定义的 Event 需要继承 ApplicationEvent ;在Spring 4.2版本开始,自定义的 Event 不再需要继承 ApplicationEvent。事件发布者需要注入 ApplicationEventPublisher事件监听者需要实现 ApplicationListener 接口发布与监听事件自定义事件public class MyEv

2021-11-06 15:40:10 397

原创 第12章 Spring Security JWT登录

什么是JWTJWS 是 JSON Web Token 的缩写,用JSON作为对象在系统之间安全地传输信息。关于JWT更多信息,请参考阮一峰的 JSON Web Token 入门教程注意:本章是基于第三章 Spring Security基于数据库登录实现的Maven依赖<!-- 新增redis依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifa

2021-10-29 16:00:00 196

原创 第11章 Spring Security 跨域

什么是跨域在了解跨域之前,我们先来了解以下同域。同域:协议、域名、端口都相同;否则就是跨域。例如在域名 aa.com 下发起一个资源访问 aa.com/books/info 的Ajax 请求,这个请求是被允许的。因为它是同域访问。如果在域名 aa.com 下发起一个资源访问 bb.com/books/info 的Ajax请求,这个请求就是跨域访问。一般情况下,跨域访问都会报错。Spring 解决办法@CrossOrigin第一种办法就是使用 @CrossOrigin 注解,可以在@RestContr

2021-10-28 14:00:00 142

原创 第10章 Spring Security HTTP认证

HTTP Basic认证HTTP Basic认证是用户的用户名和密码经过 Base64 编码以后,放在请求头 Authorization 字段中,从而完成用户身份认证。配置@Overrideprotected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and()

2021-10-27 20:07:55 413

原创 第9章 Spring Security CSRF防御

Spring Security默认就已经开启CSRF防御。什么是CSRFCSRF 是浏览器跨站伪造请求,黑客可以诱导用户执行一些用户意想不到行为,它允许攻击者部分绕开 同源策略。例如,当用户登录系统A后,用户可以修改自己的邮箱,然后浏览器提交请求如下POST /email/change HTTP/1.1Host: vulnerable-website.comContent-Type: application/x-www-form-urlencodedContent-Length: 30Coo

2021-10-23 09:33:31 380

原创 第8章 Spring Security 会话

本章节就学习Spring Security会话的应用。例如,配置会话并发数、会话固定攻击与防御、Session共享等等。会话并发管理会话并发管理是指当前用户可以在系统存在多少会话,默认情况,会话是没有限制。当然我们配置一个用户只能有一个会话,这样就可以显示踢人下线。配置基于前面配置改造,这里主要罗列最主要的配置代码@Configurationpublic class UserWebSecurityConfig extends WebSecurityConfigurerAdapter {

2021-10-20 16:22:16 2504

原创 第7章 Spring Security RememberMe

在许多应用软件我们都可以看到 RememberMe 选项。如果我们勾选的话,下次访问就无须再登录。那么Spring Security是怎么实现 RememberMe 功能呢?我们基于数据库存储token的方式来实现 RememberMe。RememberMe配置这里配置是针对第4章改造的。这里主要替换 UserWebSecurityConfig 的 configure 方法@Overrideprotected void configure(HttpSecurity http) throws Exce

2021-10-18 19:49:34 103

原创 第6章 Spring Security 密码加密器

Spring Security内置许多密码加密器PasswordEncoder接口PasswordEncoder 接口表示密码器,负责密码校验、加密。public interface PasswordEncoder { // 加密 String encode(CharSequence var1); // 密码比对 boolean matches(CharSequence var1, String var2); // 是否需要对密码进行升级 default

2021-10-17 21:33:11 331

原创 第5章 Spring Security 认证剖析

在之前章节只是分析过滤器,并没有仔细地去分析认证这一块。现在我们来仔细分析一下认证详细流程。认证时序图UsernamePasswordAuthenticationFilter 过滤器会调用 attemptAuthentication 方法进行认证。在 attemptAuthentication 方法内部会根据传递进来的 username 和 password 封装成 UsernamePasswordAuthenticationToken 对象,并由 AuthenticationManager 管理器调用

2021-10-15 17:20:59 118

原创 第4章 Spring Security 基于数据库的登录认证

一般来说,我们的用户信息都是存放在数据库中的,本章节就基于数据库来完成认证与授权。数据库设计这里需要三张表:user(用户信息表)、role(角色表)、user_role(用户与角色关系表)。一般来说,角色与权限相关,所以用户具有什么样的角色,就拥有什么样的权限。create table `user` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password`

2021-10-14 17:21:11 174

原创 第3章 Spring Security 认证Authentication

在Spring Security中 Authentication 对象代表认证用户的数据对象,包含一些用户基本信息(用户名、密码)。Authentication接口public interface Authentication extends Principal, Serializable { // 获取用户权限 Collection<? extends GrandtedAuthoriry> getAuthorities(); // 获取用户凭证,一般就是密码

2021-10-13 21:10:57 537

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除