spring security认证流程

spring security认证流程
大概流程如下:
在这里插入图片描述
面试话术:
1.客户端提交用户登陆表单,通过UsernamePasswordAuthenticationFilter后,会被封装成一个authentication对象。
2.同时会调用AuthenticationManager的实现类ProviderManager中的authenticate方法。该方法会去DaoAuthenticationProvider中调用loadUserByUsername。它会去数据库查询我们的用户信息,包括权限等,然后返回一个userDetails对象。
3.然后会通过passwordEncoder对比authentication对象和userDetails对象中的密码正不正确。正确则将userDetails对象中的信息设置到authentication对象中。返回给UsernamePasswordAuthenticationFilter,最后将信息设置到写入到SecurityContextHolderSecurityContext的属性authentication上面。其他过滤器依靠其信息作过滤判断。

以下内容可忽略
以下内容可忽略

jwt+springsecurity具体实现:
①引入依赖。登陆实体类实现userdetail。重写getAuthorities();
②写登陆接口,传入用户名和密码,验证码以及request等
③request.getSession().getAttribute(“captcha”);获得验证码并比较
④用userDetailsService.loadUserByUsername(username);判断提交的与数据库的是否一致
⑤用passwordEncoder.matches(password, userDetails.getPassword()比较密码
⑥判断是否处于禁用状态,然后用new UsernamePasswordAuthenticationToken
(userDetails , null, userDetails.getAuthorities());获得authenticationToken。
⑦用authenticationToken更新登陆对象,用userDetails生成token
⑧用map存入token和tokenHead并返回

对于security:
①配置类需要继承websecurityconfigadapter,重写三个configure,一个用来放行,哪些请求路径不需过滤
一个用来解析比较密码是否一致,指定了BCryptPasswordEncoder作为加密后比较
另一个用来指定使用jwt作为请求过滤,可以添加addFilterBefore来自定义jwt登陆授权过滤器,以及一些未授权和未登录的返回结果。
同时还能用withObjectPostProcessor来实现动态权限配置:
object.setAccessDecisionManager(customUrlDecisionManager);
object.setSecurityMetadataSource(customFilter);
②重写了UserDetailsService,来设置角色。

判断用户角色:implements AccessDecisionManager
判断url需要什么角色:implements FilterInvocationSecurityMetadataSource
判断是否登陆或者token失效,即认证失败时:implements AuthenticationEntryPoint
判断没有权限时:implements AccessDeniedHandler
自定义jwt过滤器:extends OncePerRequestFilter::::JwtAuthencationTokenFilter extends OncePerRequestFilter

登陆认证流程:
客户端发起一个请求,进入 Security 过滤器链。

1.当到 LogoutFilter 的时候判断是否是登出路径,
如果是登出路径则到 logoutHandler ,如果登出成功则到 logoutSuccessHandler 登出成功处理。
如果不是登出路径则直接进入下一个过滤器。

2.当到 UsernamePasswordAuthenticationFilter 的时候判断是否为登录路径,
如果是,则进入该过滤器进行登录操作,如果登录失败则到 AuthenticationFailureHandler ,
登录失败处理器处理,如果登录成功则到 AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进入该过滤器。

3.进入认证BasicAuthenticationFilter进行用户认证,
成功的话会把认证了的结果写入到SecurityContextHolder中SecurityContext的属性authentication上面。
如果认证失败就会交给AuthenticationEntryPoint认证失败处理类,或者抛出异常被后续ExceptionTranslationFilter过滤器处理异常,
如果是AuthenticationException就交给AuthenticationEntryPoint处理,如果是AccessDeniedException异常则交给AccessDeniedHandler处理。

4.当到 FilterSecurityInterceptor 的时候会拿到 uri ,根据 uri 去找对应的鉴权管理器,
鉴权管理器做鉴权工作,鉴权成功则到 Controller 层,否则到 AccessDeniedHandler 鉴权失败处理器处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security认证流程可以简要描述如下: 1. 当一个请求进入系统时,会经过一个过滤器链,其中包括一个实现了AbstractAuthenticationProcessingFilter的过滤器。 2. 这个过滤器会首先判断请求的URI是否需要认证,如果需要认证,则执行attemptAuthentication方法进行认证。 3. attemptAuthentication方法会调用AuthenticationManager进行认证,AuthenticationManager是一个接口,具体的实现类是ProviderManager。 4. ProviderManager内部包含了一个List<AuthenticationProvider>对象,通过AuthenticationProvider接口的实现类来扩展不同的认证提供者。 5. 在认证过程中,AuthenticationManager会依次调用每个AuthenticationProvider的authenticate方法进行认证。 6. 如果认证成功,会将认证后的Authentication对象存放到SecurityContext中。 7. 如果认证失败,会通过认证失败处理器AuthenticationFailureHandler进行处理。 8. 认证成功后,会执行successfulAuthentication方法,将已认证的Authentication存放到SecurityContext中。 9. 这样,下一个请求进来时,系统就能知道该请求是否已经通过认证。 总结起来,Spring Security认证流程包括了过滤器链、认证管理器、认证提供者和认证失败处理器等组件,通过这些组件的协作,实现了对请求的认证和授权。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [SpringSecurity认证流程分析](https://blog.csdn.net/chisuisi5702/article/details/126281839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Spring Security认证过程](https://blog.csdn.net/weixin_38927257/article/details/102960752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值