【框架-SpringSecurity】
文章平均质量分 89
【框架-SpringSecurity】
我一直在流浪
这个作者很懒,什么都没留下…
展开
-
SpringSecurity Oauth2 - 访问令牌续期
在Spring Security OAuth2中,访问令牌的续期通常是通过使用**刷新令牌(Refresh Token)**来实现的。当访问令牌过期时,客户端可以使用之前获取的刷新令牌来获取新的访问令牌,而不需要再次请求用户认证。这个刷新令牌可以在访问令牌过期后用于请求新的访问令牌。② 当访问令牌过期时,客户端可以通过向授权服务器发送一个带有刷新令牌的请求来获取新的访问令牌。:当访问令牌过期时,客户端可以通过向授权服务器发送一个带有刷新令牌的请求来获取新的访问令牌。: 客户端密钥,用于验证客户端的身份。原创 2024-09-01 23:01:21 · 1150 阅读 · 0 评论 -
SpringSecurity Oauth2 - 密码认证获取访问令牌源码分析
① 过滤器链:在Spring Security的配置中,这些过滤器通常被配置在一个过滤器链中,这样每个请求都会经过这些过滤器,并根据请求路径、请求参数和方法来决定该请求需要经过哪些过滤器的处理。③ 令牌存储:这些过滤器通常会结合令牌存储(例如内存存储、数据库存储或JWT存储)一起使用,以管理访问令牌和刷新令牌的生成、存储、验证和撤销。在这个类中,你可以配置上述的过滤器,并指定授权路径、令牌路径、客户端详细信息服务、以及各种授权方式的处理逻辑。② 用户凭证验证:如果客户端验证通过,,确保客户端的合法性。原创 2024-09-01 22:15:07 · 1301 阅读 · 0 评论 -
SpringSecurity Oauth2 -密码模式完成身份认证 [自定义AuthenticationProvider]
TokenStore是 Spring Security OAuth2 中用于管理 OAuth2 令牌(Access Token 和 Refresh Token)的接口。它的主要作用是定义如何生成、存储、读取和删除令牌。TokenStore的具体实现类决定了令牌的存储方式,例如存储在内存中、数据库中、Redis 中,或以 JWT 的形式进行编码。TokenStore的主要作用:① 生成和存储令牌:当客户端请求令牌时,TokenStore。原创 2024-09-01 17:09:09 · 1082 阅读 · 0 评论 -
SpringSecurity Oauth2 - 密码模式完成身份认证获取令牌 [自定义UserDetailsService]
TokenStore是 Spring Security OAuth2 中用于管理 OAuth2 令牌(Access Token 和 Refresh Token)的接口。它的主要作用是定义如何生成、存储、读取和删除令牌。TokenStore的具体实现类决定了令牌的存储方式,例如存储在内存中、数据库中、Redis 中,或以 JWT 的形式进行编码。TokenStore的主要作用:① 生成和存储令牌:当客户端请求令牌时,TokenStore。原创 2024-09-01 16:49:07 · 1132 阅读 · 0 评论 -
SpringSecurity Oauth2 - ClientCredentialsTokenEndpointFilter 源码认证clientId和clientSecret
最近打算再看下SpringSecurity Oauth2 身份认证和授权,搭建了一个项目准备自己重新把常见的认证方式再实现一遍,发现出现clientId和clientSecret认证错误的问题,于是追踪源码,发现是client_id写成了client-id。原创 2024-09-01 16:22:54 · 410 阅读 · 0 评论 -
SpringSecurity Oauth2 - 11 只要请求访问后台接口就延长访问令牌过期时间
系统使用的是SpringSecurity Oauth2框架做认证授权中心,当请求访问系统受限资源时都会判断请求携带的token是否正确,所以可以自定义CustomTokenExtractor继承BearerTokenExtractor,在提取到token后,通过token获取redis中存储的控制页面退出登录时长的key和用于延长token过期时长的key,将控制页面过期时长的key的过期时间重新设置为延长token过期时长的key的value值。这个续期时长要和页面自动退出登录的时长一致。原创 2022-12-16 12:35:20 · 2336 阅读 · 0 评论 -
SpringSecurity Oauth2 - 10 自定义SpEL权限表达式配置白名单url不需要token认证和鉴权
*** MethodSecurityExpressionOperations 接口方法的属性/*** SecurityExpressionRoot 类中的属性/*** 判断是否是白名单WhiteUrl,不校验权限,不需要token// 白名单url,直接返回true return true;} /*** 修改 SecurityExpressionRoot 类中的该方法** 登录请求url是否是白名单WhiteUrl,如果是则不需要校验权限,直接返回true。原创 2022-11-10 23:38:42 · 4351 阅读 · 0 评论 -
SpringSecurity Oauth2 - 09 自定义SpEL权限表达式
*** MethodSecurityExpressionOperations 接口方法的属性/*** 添加一个新的方法,这个方法就是我们自定义的权限表达式} /*** 构造方法} /*** 下面的方法都是 MethodSecurityExpressionOperations 接口中的实现方法,没有更改} }} }原创 2022-11-10 10:57:07 · 566 阅读 · 0 评论 -
SpringSecurity Oauth2 - 08 SpEL权限表达式源码分析及两种权限控制方式原理
SpringSecurity提供的权限管理功能主要有两种类型:① 基于过滤器的权限管理(FilterSecurityInterceptor):用来拦截HTTP请求,拦截下来之后,根据HTTP请求地址进行权限校验;请求首先到大过滤器FilterSecurityInterceptor,在其执行过程中,首先会由前置处理器去判断发起请求的用户是否具备响应的权限,如果具备则继续向下走,到达目标方法后执行完毕。拦截请求的url,这种权限管理方式粒度较粗。原创 2022-11-10 09:38:05 · 1252 阅读 · 0 评论 -
SpringSecurity Oauth2 - 07 整合Redis延长页面自动退出登录时间
获取全局的过期时长(该key永不过期,存储了延长页面自动退出登录的过期时长),用于延长页面退出登录的过期时间;延长控制页面退出登录的key的过期时间:当前时间+全局的过期时长;延长用户token页面过期时间:当前时间+全局的过期时长;刷新页面的登录状态;返回accessToken;如果key已经过期,则直接返回accessToken=null;/*** 从请求中提取 token。原创 2022-11-07 22:33:29 · 1120 阅读 · 0 评论 -
SpringSecurity Oauth2 - 06 拦截器获取用户登录信息并存储到本地线程ThreadLocal
上一讲已经我们分析了/oauth/token认证流程,明白了整个认证过程核心做了哪些事情,这一讲看一下如何配置拦截器判断用户是否登录并获取用户登录信息,同时将获取的登录信息存储到本地线程中,主要分为两点展开说明原创 2022-11-07 12:15:31 · 3876 阅读 · 0 评论 -
SpringSecurity Oauth2 - 05 /oauth/token请求认证流程源码分析
因为这一讲内容和上一讲内容关联较大,这里再把上一讲内容的核心点过一遍,关于资源服务器和认证服务器项目结构的搭建就不多说了,前面已经讲解过。/*** 认证* @param authentication 待认证的对象 principal:loginJsonString, credentials:""* @return Authentication 认证成功后填充的对象* @throws AuthenticationException 异常。原创 2022-11-06 15:39:31 · 1606 阅读 · 0 评论 -
SpringSecurity Oauth2 - 04 自定义AuthProvider实现认证登录
}注意:/api/v1/login 请求资源时受保护的资源,因此需要在资源服务器中放行该请求http . authorizeRequests() // 放行的请求 . antMatchers("/api/v1/login") . permitAll() // 其他请求必须认证才能访问 . anyRequest() . authenticated() . and() . csrf() . disable();} }原创 2022-11-05 10:57:42 · 1723 阅读 · 1 评论 -
SpringSecurity Oauth2 - 03 内存数据源完成认证登录
搭建资源服务器和授权服务器我前面文章已经讲过,资源服务器是一个starter,这里就不重复了。原创 2022-11-04 22:45:48 · 297 阅读 · 0 评论 -
SpringSecurity Oauth2 - 02 搭建资源服务器
这个存储配置类在搭建授权服务器的时候就讲到过,资源服务器和授权服务器需要使用同一个token存储方式。,这里我搭建资源服务器来访问受限资源。原创 2022-11-03 20:28:58 · 834 阅读 · 1 评论 -
SpringSecurity Oauth2 - 01 搭建授权服务器(密码模式)
密码模式:在密码模式中,用户向客户端提供用户名和密码,客户端通过用户名和密码到认证服务器获取令牌:(A)用户访问客户端,提供URI连接包含用户名和密码信息给授权服务器(B)授权服务器对客户端进行身份验证(C)授权通过,返回access_token给客户端原创 2022-11-01 21:38:53 · 1402 阅读 · 2 评论 -
SpringSecurity Oauth2 - 自定义 SpringBoot Starter 远程访问受限资源
在实际开发中,对于一些通用业务和公共组件,我们可能想将其做成一个Spring Boot Starter便于所有系统使用,这就需要我们定义自己的Spring Boot Starter。一个Spring Boot Starter都需要具备哪些能力:① 提供了统一的dependency版本管理:仅需要导入对应的Starter依赖,相关的library,甚至是中间件,都一次性被引入了,而且要保证各dependency之间是不冲突的。原创 2022-09-29 19:39:36 · 502 阅读 · 0 评论 -
SpringSecurity Oauth2 - SpringSecurity Oauth2 搭建授权服务器和资源服务器
① 请求用户是否授权,获取授权码code,浏览器访问完整路径:http://localhost:8080/oauth/authorize?① 请求用户是否授权,获取授权码code,浏览器访问完整路径:http://localhost:8080/oauth/authorize?① 访问授权服务器,获取授权码code:http://localhost:8080/oauth/authorize?① 访问授权服务器,获取授权码code:http://localhost:8080/oauth/authorize?原创 2022-09-25 18:20:47 · 3839 阅读 · 2 评论 -
SpringSecurity系列 - 17 SpringSecurity 授权管理
当浏览器调用登录接口登录成功后,服务端会和浏览器之间建立一个会话 (Session) 浏览器在每次发送请求时都会携带一个 Sessionld,服务端则根据这个 Sessionld 来判断用户身份。当浏览器关闭后,服务端的 Session 并不会自动销毁,需要开发者手动在服务端调用 Session销毁方法,或者等 Session 过期时间到了自动销毁。会话并发管理就是指在当前系统中,同一个用户可以同时创建多少个会话,如果一个设备对应一个会话,那么也可以简单理解为同一个用户可以同时在多少台设备上进行登录。原创 2022-09-24 18:00:50 · 957 阅读 · 0 评论 -
SpringSecurity系列 - 16 SpringSecurity 会话管理
当浏览器调用登录接口登录成功后,服务端会和浏览器之间建立一个会话 (Session) 浏览器在每次发送请求时都会携带一个 Sessionld,服务端则根据这个 Sessionld 来判断用户身份。当浏览器关闭后,服务端的 Session 并不会自动销毁,需要开发者手动在服务端调用 Session销毁方法,或者等 Session 过期时间到了自动销毁。会话并发管理就是指在当前系统中,同一个用户可以同时创建多少个会话,如果一个设备对应一个会话,那么也可以简单理解为同一个用户可以同时在多少台设备上进行登录。原创 2022-09-24 08:43:56 · 450 阅读 · 0 评论 -
SpringSecurity系列 - 15 SpringSecurity 记住我 RememberMe
RememberMe 是一种服务器端的行为。传统的登录方式基于Session会话,一旦用户的会话超时过期,就要再次登录,这样太过于烦琐。如果能有一种机制,让用户会话过期之后,还能继续保持认证状态,就会方便很多,RememberMe 就是为了解决这一需求而生的。具体的实现思路就是通过 Cookie 来记录当前用户身份。当用户登录成功之后,会通过一定算法,将用户信息、时间戳等进行加密,加密完成后,通过响应头带回前端存储在cookie中,当浏览器会话过期之后,如果再次访问该网站,会自动将 Cookie 中的信息发原创 2022-09-24 08:05:36 · 2565 阅读 · 1 评论 -
SpringSecurity系列 - 14 PasswordEncoderFactories 设计模式之简单工厂模式
我们每次调用 PasswordEncoderFactory#createPasswordEncoder 的时候,都要创建一个新的 PasswordEncoder,实际上,如果 parser 可以复用,为了节省内存和对象创建的时间,我们可以将 PasswordEncoder 事先创建好缓存起来。DelegatingPasswordEncoder 是一个代理类,主要用来代理上面介绍的不同加密方式,它允许系统中存在不同的加密方案,很方便的完成对加密方案的升级。实例时,默认其实使用的还是。原创 2022-09-21 20:00:03 · 545 阅读 · 0 评论 -
SpringSecurity系列 - 13 SpringSecurity 密码加密认证 PasswordEncoder
最早我们使用类似 SHA-256 、SHA-512 、MD5等这样的单向 Hash 算法。用户注册成功后,保存在数据库中不再是用户的明文密码,而是经过 SHA-256 加密计算的一个字行串,当用户进行登录时,用户输入的明文密码用 SHA-256 进行加密,加密完成之后,再和存储在数据库中的密码进行比对,进而确定用户登录信息是否有效。如果系统遭遇攻击,最多也只是存储在数据库中的密文被泄漏。这样就绝对安全了吗?原创 2022-09-18 19:57:34 · 1422 阅读 · 0 评论 -
SpringSecurity系列 - 12 自定义过滤器实现登录页面添加验证码的认证
null)?= null)?} }if(!} // 1. 从请求中获取验证码 String verifyCode = request . getParameter(getKaptchaParameter());// 2. 从session中获取验证码 String sessionVerifyCode =(String) request . getSession() . getAttribute("kaptcha");// 3. 比较 if(!原创 2022-09-17 09:57:25 · 846 阅读 · 0 评论 -
SpringSecurity系列 - 11 前后端分离表单认证:自定义过滤器替换 UsernamePasswordAuthenticationFilter
SpringSecurity系列一:10 传统Web项目表单认证: UsernamePasswordAuthenticationFilter 过滤器在前后端分离的项目中,前端会以 json 格式来传递参数,这就需要我们自定义登录过滤器链来实现。原创 2022-09-16 09:26:51 · 2655 阅读 · 2 评论 -
SpringSecurity系列 - 10 传统Web项目表单认证: UsernamePasswordAuthenticationFilter 过滤器
多个AuthenticationProvider将组成⼀个列表,这个列表将由ProviderManager 代理。在 Spring Seourity 中,允许系统同时⽀持多种不同的认证⽅式,例如同时⽀持⽤户名/密码认证、 ReremberMe 认证、⼿机号码动态认证等,⽽不同的认证⽅式对应了不同的 AuthenticationProvider,所以⼀个完整的认证流程可能由多个AuthenticationProvider 来提供。首先判断登录页面中配置的。② 登录页面的控制器。原创 2022-09-15 09:44:09 · 752 阅读 · 0 评论 -
SpringSecurity系列 - 09 SpringSecurity 自定义认证数据源实现用户认证
// 自定义AuthenticationManager:并没有在工厂中暴露出来 @Override protected void configure(AuthenticationManagerBuilder builder) throws Exception {} }① 创建数据库表② 插入数据BEGIN;COMMIT;BEGIN;INSERT INTO ` role ` VALUES(1 , 'ROLE_product' , '商品管理员');原创 2022-09-14 22:13:19 · 1390 阅读 · 0 评论 -
SpringSecurity系列 - 08 oauth2认证:ClientCredentialsTokenEndpointFilter 过滤器
在 Spring Seourity 中,允许系统同时⽀持多种不同的认证⽅式,例如同时⽀持⽤户名/密码认证、 ReremberMe 认证、⼿机号码动态认证等,⽽不同的认证⽅式对应了不同的 AuthenticationProvider,所以⼀个完整的认证流程可能由多个AuthenticationProvider 来提供。到这儿认证流程就结束了,但是我们可以继续往下看一下,底层如何根据username获取客户端用户信息的。原创 2022-09-14 14:29:47 · 1941 阅读 · 1 评论 -
SpringSecurity系列 - 07 认证入口:AbstractAuthenticationProcessingFilter 过滤器
UsernamePasswordAuthenticationFilter 过滤器:SpringSecurity 中默认的是表单登录格式,即用户在表单中输入用户名和密码进行登录,登录参数的提取在 UsernamePasswordAuthenticationFilter 过滤器中完成,UsernamePasswordAuthenticationFilter 是AbstractAuthenticationProcessingFilter 针对使用用户名和密码进行身份认证而定制化的一个过滤器。原创 2022-09-14 10:53:19 · 2309 阅读 · 0 评论 -
SpringSecurity系列 - 06 SpringSecurity 登录成功后如何获取用户认证信息?设计模式之策略模式
以后每当有请求到来时,Spring Security就会先从 Session 中取出用户登录数据,保存到SecurityContextHolder 中,方便在该请求的后续处理过程中使用,同时在请求结束时将 SecurityContextHolder 中的数据拿出来保存到 Session 中,然后将SecurityContextHolder 中的数据清空。Strategy抽象策略角色:策略的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性;:实现抽象策略中的操作,该类含有具体的算法。原创 2022-09-12 10:26:31 · 1267 阅读 · 0 评论 -
SpringSecurity系列 - 05 SpringSecurity 自定义表单登录和注销登录认证
index 公共资源/hello … 受保护资源 权限管理// 开启请求的权限管理 http . authorizeRequests() // 放行 /index 请求 . mvcMatchers("/index") . permitAll() // 其他所有的请求都需要去认证 // 放行的请求资源需要写在 anyRequest() 前面 . anyRequest() . authenticated() . and() // 认证方式为表单认证 . formLogin();} }原创 2022-09-11 22:18:20 · 658 阅读 · 0 评论 -
SpringSecurity系列 - 04 SpringSecurity 的默认用户是如何生成的?
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器。通常加了@Configuration注解的配置类中会有一个或者多个加了@Bean注解的方法,这些方法将会被扫描并用于构建bean定义,初始化Spring容器。:当Spring容器中存在 ObjectPostProcessor 实例时,条件成立;如果配置类没有被注册到容器中,那么这个配置类中需要注册的bean都不会注册到容器中;原创 2022-09-10 21:34:25 · 579 阅读 · 0 评论 -
SpringSecurity系列 - 03 SpringSecurity 的默认认证数据源是什么?
/ 先从缓存中获取认证成功的UserDeails对象 UserDetails user = this . userCache . getUserFromCache(username);// 如果缓存中不存在 if(user == null) {try {// 从数据源中获取 user = retrieveUser(username ,(UsernamePasswordAuthenticationToken) authentication);原创 2022-09-10 12:14:59 · 480 阅读 · 0 评论 -
SpringSecurity系列 - 02 SpringSecurity 的默认登录页面怎么来的?
如何生成默认登录页面?原创 2022-09-10 09:35:02 · 1215 阅读 · 0 评论 -
SpringSecurity系列 - 01 SpringSecurity 的自动配置原理
经过上面的分析可以看出,默认情况下,条件都是满足的。http . authorizeRequests() // 对所有的请求开启权限认证,认证之后才能访问 . anyRequest() . authenticated() . and() // 支持表单认证 . formLogin() . and() // 支持basic认证 . httpBasic();} }WebSecurityConfigurerAdapter 这个类极其重要,Spring Security 核心配置都在这个类中,原创 2022-09-10 09:31:23 · 970 阅读 · 0 评论 -
SpringSecurity 基于SpringData JPA 的自定义用户认证
测试认证:http://localhost:8080/hello,使用zhangsan/12345678 登录认证。⑦ Service层:用户认证。原创 2022-08-30 12:28:41 · 401 阅读 · 0 评论 -
SpringSecurity 密码加密
createDelegatingPasswordEncoder() 方法中,首先定义了encoders变量,encoders中存储了每一种密码加密方案的id和所对应的加密类,例如MD4对应Md4PasswordEncoder,noop对应NoOpPasswordEncoder,其中encodingId的默认值为bcrypt,相当于默认使用的加密方案是BCryptPasswordEncoder。针对密码的所有操作,PasswordEncoder都定义好了,不同的实现类将采用不同的密码加密方案对密码进行处理。原创 2022-08-25 09:39:03 · 3207 阅读 · 0 评论 -
SpringSecurity 自定义过滤器使用 Json 格式登录
AbstractAuthenticationProcessingFilter 是一个抽象类,主要的功能是身份认证。OAuth2ClientAuthenticationProcessingFilter(Spriing OAuth2)、RememberMeAuthenticationFilter(RememberMe)都继承了 AbstractAuthenticationProcessingFilter ,并重写了方法 attemptAuthentication 进行身份认证。原创 2022-08-24 20:50:47 · 1257 阅读 · 2 评论 -
SpringSecurity 自定义用户认证
测试接口:启动项目访问// 当前登录用户的用户名 String remoteUser = request . getRemoteUser();// 判断当前用户是否具备某一个指定的角色 boolean admin = request . isUserInRole("admin");// 登录用户的用户名 System . out . println("remoteUser = " + remoteUser);} }原创 2022-08-24 09:39:47 · 1305 阅读 · 0 评论 -
SpringSecurity 登录用户数据获取
登录成功后,在后续的业务逻辑汇总,可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从HttpSession中获取数据。SecurityContextHolder 是一个静态方法,意味着我们随时随地都可以获取到登录用户信息,在service层也可以获取到登录用户信息。启动项目,登录成功后,访问/user接口,控制台就会打印出登录用户信息,当然,由于我们目前没有给用户配置角色,所以默认的用户角色为空数组。原创 2022-08-21 23:09:18 · 1790 阅读 · 0 评论