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

网站申请名称建站软件有哪些功能

网站申请名称,建站软件有哪些功能,微信小程序数据库搭建,巩义做网站汉狮公司1. spring security Spring Security 是一个提供身份验证、授权和针对常见攻击保护的框架。 凭借对保护命令式和反应式应用程序的一流支持#xff0c;它成为基于Spring的标准安全框架。 Spring Security 在最近几个版本中配置的写法都有一些变化#xff0c;很多常见的方法都…1. spring security Spring Security 是一个提供身份验证、授权和针对常见攻击保护的框架。 凭借对保护命令式和反应式应用程序的一流支持它成为基于Spring的标准安全框架。 Spring Security 在最近几个版本中配置的写法都有一些变化很多常见的方法都废弃了并且将在未来的 Spring Security7 中移除Spring Security5.7 开始对应 Spring Boot2.7 开始将重新梳理一下主要功能变化。以下是spring security的版本列表 2. spring security 新增功能 2.1 WebSecurityConfigurerAdapter gh-11923 - Remove WebSecurityConfigurerAdapter. Instead, create a SecurityFilterChain bean. 这一条更新改变了我们配置SpringSecurity的方式WebSecurityConfigurerAdapter 过期了在目前最新的 Spring Security6.1 中这个类已经完全被移除了作为替代我们需要创建类型为SecurityFilterChain的bean。 以前WebSecurityConfigurerAdapterHttpSecurity 的方式为 Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) - authz.anyRequest().authenticated()).httpBasic(withDefaults());} }SecurityFilterChainHttpSecurity 新的写法为 Configuration public class SecurityConfiguration {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) - authz.anyRequest().authenticated()).httpBasic(withDefaults());return http.build();}}以前WebSecurityConfigurerAdapterWebSecurity 的方式为 Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter {Overridepublic void configure(WebSecurity web) {web.ignoring().antMatchers(/api1, /api2);} }SecurityFilterChainWebSecurity 新的写法为 Configuration public class SecurityConfiguration {Beanpublic WebSecurityCustomizer webSecurityCustomizer() {return (web) - web.ignoring().antMatchers(/api1, /api2);} }以前WebSecurityConfigurerAdapter配置AuthenticationManager是通过重写父类的方法来获取这个 Bean Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {OverrideBeanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();} }6.0后则需要单独创建AuthenticationManager这个bean Configuration public class SecurityConfig {AutowiredUserService userService;BeanAuthenticationManager authenticationManager() {DaoAuthenticationProvider daoAuthenticationProvider new DaoAuthenticationProvider();daoAuthenticationProvider.setUserDetailsService(userService);ProviderManager pm new ProviderManager(daoAuthenticationProvider);return pm;} }也可以从 HttpSecurity 中提取出来 AuthenticationManager Configuration public class SpringSecurityConfiguration {AuthenticationManager authenticationManager;AutowiredUserDetailsService userDetailsService;Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {AuthenticationManagerBuilder authenticationManagerBuilder http.getSharedObject(AuthenticationManagerBuilder.class);authenticationManagerBuilder.userDetailsService(userDetailsService);authenticationManager authenticationManagerBuilder.build();http.csrf().disable().cors().disable().authorizeHttpRequests().antMatchers(/api/v1/account/register, /api/v1/account/auth).permitAll().anyRequest().authenticated().and().authenticationManager(authenticationManager).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);return http.build();} }Spring Security 的底层实际上就是一堆过滤器所以我们之前在 configure(HttpSecurity) 方法中的配置实际上就是配置过滤器链。现在过滤器链的配置我们通过提供一个 SecurityFilterChain Bean 来配置过滤器链SecurityFilterChain 是一个接口这个接口只有一个实现类 DefaultSecurityFilterChain构建 DefaultSecurityFilterChain 的第一个参数是拦截规则也就是哪些路径需要拦截第二个参数则是过滤器链如果给了一个空集合不设置忽略的路径请求 Spring Security 会拦截下所有的请求然后在一个空集合中走一圈就结束了相当于不拦截任何请求。 2.2 使用 Lambda表达式 and() 方法将被移除 从上面 and 方法的注释中小伙伴们可以看到官方现在是在推动基于 Lambda 的配置来代替传统的链式配置。 2.3 自定义 JSON 登录 Spring Security 默认处理登录数据的过滤器是 UsernamePasswordAuthenticationFilter在这个过滤器中系统会通过 request.getParameter(this.passwordParameter) 的方式将用户名和密码读取出来很明显这就要求前端传递参数的形式是 key-value。 步骤为 首先我们获取请求头根据请求头的类型来判断请求参数的格式。如果是 JSON 格式的参数就在 if 中进行处理否则说明是 key-value 形式的参数那么我们就调用父类的方法进行处理即可。JSON 格式的参数的处理逻辑和 key-value 的处理逻辑是一致的唯一不同的是参数的提取方式不同而已。最后我们还需要对这个过滤器进行配置 Configuration public class SecurityConfig {AutowiredUserService userService;BeanJsonLoginFilter jsonLoginFilter() {JsonLoginFilter filter new JsonLoginFilter();filter.setAuthenticationSuccessHandler((req,resp,auth)-{resp.setContentType(application/json;charsetutf-8);PrintWriter out resp.getWriter();//获取当前登录成功的用户对象User user (User) auth.getPrincipal();user.setPassword(null);RespBean respBean RespBean.ok(登录成功, user);out.write(new ObjectMapper().writeValueAsString(respBean));});filter.setAuthenticationFailureHandler((req,resp,e)-{resp.setContentType(application/json;charsetutf-8);PrintWriter out resp.getWriter();RespBean respBean RespBean.error(登录失败);if (e instanceof BadCredentialsException) {respBean.setMessage(用户名或者密码输入错误登录失败);} else if (e instanceof DisabledException) {respBean.setMessage(账户被禁用登录失败);} else if (e instanceof CredentialsExpiredException) {respBean.setMessage(密码过期登录失败);} else if (e instanceof AccountExpiredException) {respBean.setMessage(账户过期登录失败);} else if (e instanceof LockedException) {respBean.setMessage(账户被锁定登录失败);}out.write(new ObjectMapper().writeValueAsString(respBean));});filter.setAuthenticationManager(authenticationManager());filter.setFilterProcessesUrl(/login);return filter;}BeanAuthenticationManager authenticationManager() {DaoAuthenticationProvider daoAuthenticationProvider new DaoAuthenticationProvider();daoAuthenticationProvider.setUserDetailsService(userService);ProviderManager pm new ProviderManager(daoAuthenticationProvider);return pm;}BeanSecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {//开启过滤器的配置http.authorizeHttpRequests()//任意请求都要认证之后才能访问.anyRequest().authenticated().and()//开启表单登录开启之后就会自动配置登录页面、登录接口等信息.formLogin()//和登录相关的 URL 地址都放行.permitAll().and()//关闭 csrf 保护机制本质上就是从 Spring Security 过滤器链中移除了 CsrfFilter.csrf().disable();http.addFilterBefore(jsonLoginFilter(), UsernamePasswordAuthenticationFilter.class);return http.build();}}这里就是配置一个 JsonLoginFilter 的 Bean并将之添加到 Spring Security 过滤器链中即可。在 Spring Boot3 之前Spring Security6 之前上面这段代码就可以实现 JSON 登录了。 但是从 Spring Boot3 开始则存在问题具体表现就是当你调用登录接口登录成功之后再去访问系统中的其他页面又会跳转回登录页面说明访问登录之外的其他接口时系统不知道你已经登录过了。 在 Spring Boot3 之前Spring Security 过滤器链中有一个名为 SecurityContextPersistenceFilter 的过滤器这个过滤器在 Spring Boot2.7.x 中废弃了但是还在使用在 Spring Boot3 中则被从 Spring Security 过滤器链中移除了取而代之的是一个名为 SecurityContextHolderFilter 的过滤器。 先来看 SecurityContextPersistenceFilter 的核心逻辑 private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {HttpRequestResponseHolder holder new HttpRequestResponseHolder(request, response);SecurityContext contextBeforeChainExecution this.repo.loadContext(holder);try {SecurityContextHolder.setContext(contextBeforeChainExecution);chain.doFilter(holder.getRequest(), holder.getResponse());}finally {SecurityContext contextAfterChainExecution SecurityContextHolder.getContext();SecurityContextHolder.clearContext();this.repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse());} }首先这个过滤器位于整个 Spring Security 过滤器链的第三个是非常靠前的。当登录请求经过这个过滤器的时候首先会尝试从 SecurityContextRepository上文中的 this.repo中读取到 SecurityContext 对象这个对象中保存了当前用户的信息第一次登录的时候这里实际上读取不到任何用户信息。将读取到的 SecurityContext 存入到 SecurityContextHolder 中默认情况下SecurityContextHolder 中通过 ThreadLocal 来保存 SecurityContext 对象也就是当前请求在后续的处理流程中只要在同一个线程里都可以直接从 SecurityContextHolder 中提取到当前登录用户信息。请求继续向后执行。在 finally 代码块中当前请求已经结束了此时再次获取到 SecurityContext并清空 SecurityContextHolder 防止内存泄漏然后调用 this.repo.saveContext 方法保存当前登录用户对象实际上是保存到 HttpSession 中以后其他请求到达的时候执行前面第 2 步的时候就读取到当前用户的信息了在请求后续的处理过程中Spring Security 需要知道当前用户的时候会自动去 SecurityContextHolder 中读取当前用户信息。 这就是 Spring Security 认证的一个大致流程。 然而到了 Spring Boot3 之后这个过滤器被 SecurityContextHolderFilter 取代了我们来看下 SecurityContextHolderFilter 过滤器的一个关键逻辑 private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException {SupplierSecurityContext deferredContext this.securityContextRepository.loadDeferredContext(request);try {this.securityContextHolderStrategy.setDeferredContext(deferredContext);chain.doFilter(request, response);}finally {this.securityContextHolderStrategy.clearContext();request.removeAttribute(FILTER_APPLIED);} }通过这段逻辑代码我们发现前面的逻辑基本上还是一样的不一样的是 finally 中的代码finally 中少了一步向 HttpSession 保存 SecurityContext 的操作。 未处理加入SecurityContextHolderFilter过滤器之前用户登录成功后用户信息没有保存到 HttpSession导致下一次请求到达的时候无法从 HttpSession 中读取到 SecurityContext 存到 SecurityContextHolder 中在后续的执行过程中Spring Security 就会认为当前用户没有登录。这就是问题的原因 问题解决 Spring Security 提供了一个修改的入口在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#successfulAuthentication 方法中源码如下 protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,Authentication authResult) throws IOException, ServletException {SecurityContext context this.securityContextHolderStrategy.createEmptyContext();context.setAuthentication(authResult);this.securityContextHolderStrategy.setContext(context);this.securityContextRepository.saveContext(context, request, response);this.rememberMeServices.loginSuccess(request, response, authResult);if (this.eventPublisher ! null) {this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));}this.successHandler.onAuthenticationSuccess(request, response, authResult); }这个方法是当前用户登录成功之后的回调方法小伙伴们看到在这个回调方法中有一句 this.securityContextRepository.saveContext(context, request, response);这就表示将当前登录成功的用户信息存入到 HttpSession 中。 在当前过滤器中securityContextRepository 的类型是 RequestAttributeSecurityContextRepository这个表示将 SecurityContext 存入到当前请求的属性中那很明显在当前请求结束之后这个数据就没了。在 Spring Security 的自动化配置类中将 securityContextRepository 属性指向了 DelegatingSecurityContextRepository这是一个代理的存储器代理的对象是 RequestAttributeSecurityContextRepository 和 HttpSessionSecurityContextRepository所以在默认的情况下用户登录成功之后在这里就把登录用户数据存入到 HttpSessionSecurityContextRepository 中了。 当我们自定义了登录过滤器之后就破坏了自动化配置里的方案了这里使用的 securityContextRepository 对象就真的是 RequestAttributeSecurityContextRepository 了所以就导致用户后续访问时系统以为用户未登录。 那么解决方案很简单我们只需要为自定义的过滤器指定 securityContextRepository 属性的值就可以了如下 Bean JsonLoginFilter jsonLoginFilter() {JsonLoginFilter filter new JsonLoginFilter();filter.setAuthenticationSuccessHandler((req,resp,auth)-{resp.setContentType(application/json;charsetutf-8);PrintWriter out resp.getWriter();//获取当前登录成功的用户对象User user (User) auth.getPrincipal();user.setPassword(null);RespBean respBean RespBean.ok(登录成功, user);out.write(new ObjectMapper().writeValueAsString(respBean));});filter.setAuthenticationFailureHandler((req,resp,e)-{resp.setContentType(application/json;charsetutf-8);PrintWriter out resp.getWriter();RespBean respBean RespBean.error(登录失败);if (e instanceof BadCredentialsException) {respBean.setMessage(用户名或者密码输入错误登录失败);} else if (e instanceof DisabledException) {respBean.setMessage(账户被禁用登录失败);} else if (e instanceof CredentialsExpiredException) {respBean.setMessage(密码过期登录失败);} else if (e instanceof AccountExpiredException) {respBean.setMessage(账户过期登录失败);} else if (e instanceof LockedException) {respBean.setMessage(账户被锁定登录失败);}out.write(new ObjectMapper().writeValueAsString(respBean));});filter.setAuthenticationManager(authenticationManager());filter.setFilterProcessesUrl(/login);filter.setSecurityContextRepository(new HttpSessionSecurityContextRepository());return filter; }最后调用 setSecurityContextRepository 方法设置一下就行。Spring Boot3.x 之前之所以不用设置这个属性是因为这里虽然没保存最后还是在 SecurityContextPersistenceFilter 过滤器中保存了。 在登录成功之后开发者自己手动将数据存入到 HttpSession 中这样就能确保下个请求到达的时候能够从 HttpSession 中读取到有效的数据存入到 SecurityContextHolder 中。
http://www.yutouwan.com/news/225993/

相关文章:

  • 登陆网站空间盐城城南建设局一局网站
  • 佛山中谦建设网站网站外链查询
  • 下载上海发布官方网站企业展厅策划设计公司有哪些
  • 好网站页面网站什么语言好
  • 微信上打开连接的网站怎么做网站视频要vip怎么看
  • wordpress首页加音乐赣州seo唐三
  • 网站后台模板关联自己做的网站百度广告推广收费标准
  • 做海报免费素材网站有哪些网站设计与网页制作公司
  • 织梦dede建站教程视频网站建设代码编译的问题及解决方案
  • 网站 方案html代码大全txt
  • 宁波医院网站建设免费连接网络的软件
  • 什么网站做简历免费下载电子商务网站建设的方法
  • 怎么在手机上传百度云wordpress百度seo快速排名
  • alexa全球网站排名网站建设属于哪个分类编码
  • 烟台网站建设兼职开发网站的流程是
  • 西安网站公司哪家好政务网站建设依据国家
  • 企业网站的特点山东企业站点seo
  • 青岛企业建设网站企业餐饮行业做网站的数据
  • 展台设计展会展位设计广州企业网站seo
  • 网站频繁改版企业网站建设相关书籍在线阅读
  • 网站如何不被百度搜到做同业业务一般关注哪些网站
  • 网站商城建站c 网站购物车怎么做
  • 富通建设工程有限公司网站商务网站建设实验报告
  • 网站的设计路线任丘市做网站
  • 越南做网站服务器网站建设 样板
  • 深圳龙华企业网站设计wordpress下载破解
  • 网站建设吴中区绵阳 网站设计
  • 邢台网站优化服务平台企业营销推广型网站建设
  • 中色十二冶金建设集团有限公司网站阜宁做网站的公司电话
  • 网站搭建好之后提示网页走丢了网店logo设计