当前位置: 首页 > news >正文

北京 公司网站开发建设网站阿里云服务器

北京 公司网站开发,建设网站阿里云服务器,网站建设公司 盐城市,哪个网站可以建设网站Filter Spring Security 是基于 Sevlet Filter 实现的。下面是一次 Http 请求从 client 出发#xff0c;与 Servlet 交互的图#xff1a; 当客户端发送一个请求到应用#xff0c;容器会创建一个 FilterChain#xff0c;FilterChain 中包含多个 Filter 和 Servlet。这些 Fi…Filter Spring Security 是基于 Sevlet Filter 实现的。下面是一次 Http 请求从 client 出发与 Servlet 交互的图 当客户端发送一个请求到应用容器会创建一个 FilterChainFilterChain 中包含多个 Filter 和 Servlet。这些 Filter 和 Servlet 是用来处理 HttpServletRequest 的。在 Spring MVC 应用中Servlet 实际上是一个 DispatcherServlet。 DelegatingFilterProxy Spring 提供了一个名字叫 DelegatingFilterProxy 的 Filter 实现。直译过来就是委托过滤器代理。DelegatingFilterProxy 可以对 Servlet 容器的生命周期和 Spring 的 ApplicationContext 容器进行桥接。Servlet 容器可以通过非 Spring 的方式注册 Filter 实例。也就是说我们可以通过 Servlet 容器机制注册 DelegatingFilterProxy但是却可以把所有的工作委托给实现了 Filter 的 Spring Bean。 DelegatingFilterProxy 会从 ApplicationContext 容器中寻找并调用 Bean Filter0。DelegatingFilterProxy 允许推迟查找 Filter Bean 实例。这很重要因为容器在启动前需要注册 Filter 实例。 FilterChainProxy FilterChainProxy 由 DelegatingFilterProxy 包裹的一个 Filter 。FilterChainProxy 是一个通过 SecurityFilterChain 来包含多个 Filter 实例的特殊的 Filter。 SecurityFilterChain SecurityFilterChain 被 FilterChainProxy 使用。SecurityFilterChain 用来确定当前请求应该调用哪些 Filter 实例。 在 SecurityFilterChain 中的 Security Filters 是典型的 Bean。但是它们是随着 FilterChainProxy 一起注册的而不是跟着 DelegatingFilterProxy 一起注册的。FilterChainProxy 是 Spring Security 支持的起点。所以在排除认证会权限的问题时可以将断点打在 FilterChainProxy 里。 下图展示多个 SecurityFilterChain 实例 在多 SecurityFilterChain 实例配置中FilterChainProxy 决定哪个 SecurityFilterChain 将会被使用。只有第一个被匹配上的 SecurityFilterChain 才会被调用。比如一个请求 /api/a它能与第0个 SecurityFilterChain /api/**和n个 /** 匹配但是只会调用第0个。 每个 SecurityFilterChain 都有自己独立且隔离的 Filter 实例。 Security Filters Security Filters 被通过 SecurityFilterChain 的 API 插入到 FilterChainProxy 中。这些 filter 可以被用作不同的目的。比如认证、鉴权、漏洞保护等。这些 filter 以特定的顺序进行执行从而保证它们在正确的时机被调用比如认证需要在鉴权之前被执行。通常我们不需要关心这些 filter 的顺序但是我们可以在 FilterOrderRegistration 类中查看这些顺序。 Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(Customizer.withDefaults()) .authorizeHttpRequests(authorize - authorize .anyRequest().authenticated()) .httpBasic(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()); return http.build(); } }上面的代码会导致 filter 的顺序如下 FilterAdded byCsrfFilterHttpSecurity#csrfUsernamePasswordAuthenticationFilterHttpSecurity#formLoginBasicAuthenticationFilterHttpSecurity#httpBasicAuthorizationFilterHttpSecurity#authorizeHttpRequests Printing the Security Filters spring boot 在 info 级别的日志会打印请求要经过哪些 Spring Security 的 filter。在控制台中会打印成一行。与下面的日志看起来会有点不一样 2023-06-14T08:55:22.321-03:00 INFO 76975 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [ org.springframework.security.web.session.DisableEncodeUrlFilter404db674, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter50f097b5, org.springframework.security.web.context.SecurityContextHolderFilter6fc6deb7, org.springframework.security.web.header.HeaderWriterFilter6f76c2cc, org.springframework.security.web.csrf.CsrfFilterc29fe36, org.springframework.security.web.authentication.logout.LogoutFilteref60710, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter7c2dfa2, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter4397a639, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter7add838c, org.springframework.security.web.authentication.www.BasicAuthenticationFilter5cc9d3d0, org.springframework.security.web.savedrequest.RequestCacheAwareFilter7da39774, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter32b0876c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter3662bdff, org.springframework.security.web.access.ExceptionTranslationFilter77681ce4, org.springframework.security.web.access.intercept.AuthorizationFilter169268a7]如果我们想看到 filter 的调用链以及 Spring Security 的详细报错信息我们可以通过对日志级别的调整进行打印将 org.springframework.security 的日志级别调整为TRACE 即可。 logging: level: root: info org.springframework.security: trace发出一个 /hello 请求后控制台输出如下2023-06-14T09:44:25.797-03:00 DEBUG 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Securing POST /hello 2023-06-14T09:44:25.797-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Invoking DisableEncodeUrlFilter (1/15) 2023-06-14T09:44:25.798-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Invoking WebAsyncManagerIntegrationFilter (2/15) 2023-06-14T09:44:25.800-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Invoking SecurityContextHolderFilter (3/15) 2023-06-14T09:44:25.801-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Invoking HeaderWriterFilter (4/15) 2023-06-14T09:44:25.802-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : Invoking CsrfFilter (5/15) 2023-06-14T09:44:25.814-03:00 DEBUG 76975 --- [nio-8080-exec-1] o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:8080/hello 2023-06-14T09:44:25.814-03:00 DEBUG 76975 --- [nio-8080-exec-1] o.s.s.w.access.AccessDeniedHandlerImpl : Responding with 403 status code 2023-06-14T09:44:25.814-03:00 TRACE 76975 --- [nio-8080-exec-1] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match request to [Is Secure]添加自定义的 filter 到 Filter Chain 如果需要添加自定义的 filter例如添加一个校验 tenantId 的 filter 首先定义一个 filter import java.io.IOException;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;import org.springframework.security.access.AccessDeniedException;public class TenantFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request (HttpServletRequest) servletRequest;HttpServletResponse response (HttpServletResponse) servletResponse;String tenantId request.getHeader(X-Tenant-Id); boolean hasAccess isUserAllowed(tenantId); if (hasAccess) {filterChain.doFilter(request, response); return;}throw new AccessDeniedException(Access denied); } }然后将自定义的 filter 加入到 security filter chain 中 Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http // ... .addFilterBefore(new TenantFilter(), AuthorizationFilter.class); return http.build(); }添加 filter 时可以指定 filter 位于某个给定的 filter 的前或者后。从而保证 filter 的执行顺序。 需要注意的是在定义 Filter 时不要将 filter 定义为 Spring Bean。因为 Spring 会自动把它注册到 Spring 的容器中从而导致 filter 被调用两次一次被 Spring 容器调用一次被 Spring Security 调用。 如果非要定义为 Spring Bean可以使用 FilterRegistrationBean 来注册该filter并把 enabled 属性设置为 false。示例代码如下: Bean public FilterRegistrationBeanTenantFilter tenantFilterRegistration(TenantFilter filter) {FilterRegistrationBeanTenantFilter registration new FilterRegistrationBean(filter);registration.setEnabled(false);return registration; }处理 Security Exceptions ExceptionTranslationFilter 被作为一个 security filter 被插入到 FilterChainProxy 中它可以将 AccessDeniedException 和 AuthenticationException 两个异常转换成 http response。 下图是 ExceptionTranslationFilter 与其他组件的关系 如果应用没有抛出 AccessDeniedException 和 AuthenticationException 这两个异常ExceptionTranslationFilter 什么都不会做。 在 Authentication 之间保存 Requests 在一个没有认证成功的请求过来后有必要将 request 缓存起来为认证成功后重新请求使用。 RequestCacheAwareFilter 类用 RequestCache 来保存 HttpServletRequest。 默认情况下是使用 HttpSessionRequestCache 下面的代码展示了如何自定义 RequestCache 实现该实现用于检查 HttpSession 是否存在已保存的请求(如果存在名为 Continue 的参数)。 Bean DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception {HttpSessionRequestCache requestCache new HttpSessionRequestCache();requestCache.setMatchingRequestParameterName(continue);http// ....requestCache((cache) - cache.requestCache(requestCache));return http.build(); }如果你想禁用 Request 缓存的话可以使用 NullRequestCache 实现。示例代码如下 Bean SecurityFilterChain springSecurity(HttpSecurity http) throws Exception {RequestCache nullRequestCache new NullRequestCache();http// ....requestCache((cache) - cache.requestCache(nullRequestCache));return http.build(); }
http://www.hkea.cn/news/14291909/

相关文章:

  • 东钱湖镇建设局网站WordPress 付费文章插件
  • 做产品推广哪个网站好图片网站 代码
  • 网站建设的ppt模板下载网站备案查询 怎么弄
  • 杭州网站建设长春公司免费ppt下载网站有哪些
  • 做悬赏的网站路由器统一登录网站
  • 公司做网站需要给百度交钱吗竹妃怎么在公众号里做网站
  • 平面设计鉴赏网站逆袭做富豪官方网站
  • 做网站要审批吗seo优化工具
  • 企业网站建设合同(一)北京服饰电商网站建设
  • 西安网站建设聂卫西安住房和城乡建设部网站
  • 临沂制作网站软件海南哪家公司做网站
  • 绿盒子网站建设案例数据网站建设多少钱
  • 网站注册页面模板下载wordpress响应式网站模板
  • 建设网站必备的开发工具局域网聊天工具排行
  • mvc网站入口asp如何制作个人网站
  • 科技公司网站模板门户类网站建设
  • 石家庄手机网站建站南昌网站建设q479185700棒
  • 白城百度网站建设个人域名备案的要求
  • 网站别人帮做的要注意什么房屋设计网站推荐
  • 郑州企业做网站安卓版wordpress
  • 做网站实训心得体会谷歌怎么投放广告
  • 网页优化seo广州百度seo优化培训
  • 成都双流兴城建设投资有限公司网站岳阳网站建设哪里便宜
  • 网站集成微信登陆电子商务网站设计策划书
  • 东莞网站建设服务公司创建公司网站需要准备哪些素材
  • 北京建网站报价怎样建设微网站
  • 江苏网站建设系统方案莱芜金点子最新招工信息
  • 北京所有公司名单成都seo招聘信息
  • 北京app网站建设wordpress百度地图
  • 东莞专业网站建设公司衡阳百度网站建设