0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

「Spring」认证安全架构指南

「Spring」认证安全架构 来源:「Spring」认证安全架构 作者:「Spring」认证安全 2022-06-27 14:37 次阅读

本指南是 Spring Security 的入门指南,提供对框架设计和基本构建块的深入了解。我们仅涵盖应用程序安全的基础知识。但是,这样做,我们可以清除使用 Spring Security 的开发人员遇到的一些困惑。为此,我们通过使用过滤器,更一般地,通过使用方法注解,来看看在 Web 应用程序中应用安全性的方式。当您需要深入了解安全应用程序的工作原理、如何对其进行自定义或需要学习如何考虑应用程序安全性时,请使用本指南。

本指南并非旨在作为解决最基本问题的手册或秘诀(这些问题还有其他来源),但它对初学者和专家都可能有用。Spring Boot 也经常被引用,因为它为安全应用程序提供了一些默认行为,并且了解它如何与整体架构相适应会很有用。

所有原则同样适用于不使用 Spring Boot 的应用程序。

身份验证和访问控制

应用程序安全性归结为两个或多或少独立的问题:身份验证(你是谁?)和授权(你可以做什么?)。有时人们会说“访问控制”而不是“授权”,这可能会让人感到困惑,但这样想可能会有所帮助,因为“授权”在其他地方被重载了。Spring Security 的架构旨在将身份验证与授权分开,并为两者提供策略和扩展点。

验证

认证的主要策略接口AuthenticationManager,它只有一个方法:

public interface AuthenticationManager {

  Authentication authenticate(Authentication authentication)
    throws AuthenticationException;
}

An可以在其方法AuthenticationManager中做三件事之一:authenticate()

  • 如果它可以验证输入代表一个有效的主体,则返回一个Authentication(通常带有)。authenticated=true
  • AuthenticationException如果它认为输入代表无效的委托人,则抛出一个。
  • null如果它不能决定返回。

AuthenticationException是运行时异常。它通常由应用程序以通用方式处理,具体取决于应用程序的样式或用途。换句话说,通常不期望用户代码来捕获和处理它。例如,Web UI 可能会呈现一个说明身份验证失败的页面,并且后端 HTTP 服务可能会发送一个 401 响应,WWW-Authenticate根据上下文是否有标头。

最常用的实现AuthenticationManagerProviderManager,它委托给一个AuthenticationProvider实例链。AnAuthenticationProvider有点像 an AuthenticationManager,但它有一个额外的方法允许调用者查询它是否支持给定的Authentication类型:

public interface AuthenticationProvider {

	Authentication authenticate(Authentication authentication)
			throws AuthenticationException;

	boolean supports(Class authentication);
}

方法中的Class参数supports()是真的Class(只询问它是否支持传递给authenticate()方法的东西)。AProviderManager可以通过委托给AuthenticationProviders. 如果 aProviderManager不能识别特定的Authentication实例类型,则会跳过它。

AProviderManager有一个可选的父级,如果所有提供者都返回,它可以咨询它null。如果父级不可用,则null Authentication结果为AuthenticationException.

有时,应用程序具有受保护资源的逻辑组(例如,与路径模式匹配的所有 Web 资源,例如/api/**),并且每个组都可以有自己的专用AuthenticationManager. 通常,它们中的每一个都是一个ProviderManager,并且它们共享一个父级。然后,父级是一种“全局”资源,充当所有提供者的后备。

「Spring」认证安全架构指南

图 1. 使用的AuthenticationManager层次结构ProviderManager

自定义身份验证管理器

Spring Security 提供了一些配置助手来快速获取应用程序中设置的常见身份验证管理器功能。最常用的帮助程序是
AuthenticationManagerBuilder,它非常适合设置内存、JDBC 或 LDAP 用户详细信息或添加自定义UserDetailsService. 以下示例显示了一个配置全局(父)的应用程序AuthenticationManager

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

   ... // web stuff here

  @Autowired
  public void initialize(AuthenticationManagerBuilder builder, DataSource dataSource) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

此示例与 Web 应用程序相关,但 的使用
AuthenticationManagerBuilder更广泛(有关如何实现 Web 应用程序安全性的更多详细信息,请参阅Web 安全性)。请注意,它
AuthenticationManagerBuilder@Autowired在 a 中的一个方法中@Bean ——这就是它构建全局(父)的原因AuthenticationManager。相反,请考虑以下示例:

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

  @Autowired
  DataSource dataSource;

   ... // web stuff here

  @Override
  public void configure(AuthenticationManagerBuilder builder) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

如果我们@Override在配置器中使用了 of 方法,那么
AuthenticationManagerBuilder将仅用于构建“本地” AuthenticationManager,这将是全局方法的子对象。在 Spring Boot 应用程序中,您可以@Autowired将全局 bean 放入另一个 bean,但您不能对本地 bean 执行此操作,除非您自己显式公开它。

Spring Boot 提供了一个默认的全局AuthenticationManager(只有一个用户),除非您通过提供自己的 bean 类型来抢占它AuthenticationManager。默认值本身就足够安全,您不必担心太多,除非您主动需要自定义全局AuthenticationManager. 如果您进行任何构建AuthenticationManager.

授权或访问控制

一旦认证成功,我们就可以继续进行授权,这里的核心策略是AccessDecisionManager. 框架提供了三个实现,所有三个都委托给一个AccessDecisionVoter实例链,有点像ProviderManager委托给AuthenticationProviders.

AnAccessDecisionVoter考虑一个Authentication(代表一个主体)和一个安全的Object,它被装饰了ConfigAttributes

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

int vote(Authentication authentication, S object,
        Collection attributes);

在和的Object签名中是完全通用的。它代表用户可能想要访问的任何内容(Web 资源或 Java 类中的方法是最常见的两种情况)。它们也是相当通用的,代表安全的装饰,带有一些决定访问它所需的权限级别的元数据。是一个接口。它只有一个方法(非常通用并返回 a ),因此这些字符串以某种方式编码了资源所有者的意图,表达了关于允许谁访问它的规则。典型的是用户角色的名称(如or ),它们通常具有特殊格式(如
AccessDecisionManagerAccessDecisionVoterConfigAttributesObjectConfigAttributeStringConfigAttributeROLE_ADMINROLE_AUDITROLE_前缀)或表示需要评估的表达式。

大多数人使用默认值AccessDecisionManager,即AffirmativeBased(如果任何选民肯定返回,则授予访问权限)。通过添加新的或修改现有的工作方式,任何定制都倾向于发生在选民身上。

使用 Spring 表达式语言 (SpEL) 表达式非常常见ConfigAttributes——例如,isFullyAuthenticated() && hasRole('user'). 这由AccessDecisionVoter可以处理表达式并为它们创建上下文的 an 支持。要扩展可以处理的表达式范围,SecurityExpressionRoot有时还需要自定义实现SecurityExpressionHandler.

网络安全

Web 层中的 Spring Security(用于 UI 和 HTTP 后端)是基于 Servlet 的Filters,所以首先看一下Filters一般的作用是有帮助的。下图显示了单个 HTTP 请求的处理程序的典型分层。

「Spring」认证安全架构指南

客户端向应用程序发送请求,容器根据请求 URI 的路径决定应用哪些过滤器和哪个 servlet。最多一个 servlet 可以处理一个请求,但是过滤器形成一个链,所以它们是有序的。事实上,如果过滤器想要自己处理请求,它可以否决链的其余部分。过滤器还可以修改下游过滤器和 servlet 中使用的请求或响应。过滤器链的顺序非常重要,Spring Boot 通过两种机制来管理它:@Beans类型Filter可以有一个@Order或实现Ordered,它们可以是一个FilterRegistrationBean它本身有一个订单作为其 API 的一部分。一些现成的过滤器定义了自己的常量来帮助表明他们喜欢的相对于彼此的顺序(例如,SessionRepositoryFilter来自 Spring Session 有一个DEFAULT_ORDERof Integer.MIN_VALUE + 50,它告诉我们它喜欢在链中处于早期,但是它不排除在它之前出现其他过滤器)。

Spring Security 在链中作为单个安装Filter,其具体类型是FilterChainProxy,原因我们很快就会介绍。在 Spring Boot 应用程序中,安全过滤器位于@BeanApplicationContext,默认情况下会安装它,以便将其应用于每个请求。它安装在由 定义的位置
SecurityProperties.DEFAULT_FILTER_ORDER,该位置又被锚定
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER(Spring Boot 应用程序在包装请求时期望过滤器具有的最大顺序,修改其行为)。不仅如此:从容器的角度来看,Spring Security 是一个单一的过滤器,但在其中,还有额外的过滤器,每个过滤器都扮演着特殊的角色。下图显示了这种关系:

「Spring」认证安全架构指南

图 2. Spring Security 是单一物理的Filter,但将处理委托给内部过滤器链

实际上,安全过滤器中甚至还有一层间接性:它通常以 . 的形式安装在容器中DelegatingFilterProxy,而不必一定是 Spring @Bean。代理委托给 a FilterChainProxy,它始终是 a @Bean,通常具有固定名称springSecurityFilterChain。它FilterChainProxy包含在内部排列为过滤器链(或链)的所有安全逻辑。所有过滤器都具有相同的 API(它们都实现了FilterServlet 规范中的接口),并且它们都有机会否决链的其余部分。

可以有多个过滤器链都由 Spring Security 在同一顶层管理,FilterChainProxy并且对容器都是未知的。Spring Security 过滤器包含一个过滤器链列表,并将请求分派到与其匹配的第一个链。下图显示了基于匹配请求路径(/foo/**匹配之前/**)发生的调度。这很常见,但不是匹配请求的唯一方法。这个分派过程最重要的特点是只有一个链处理一个请求。

「Spring」认证安全架构指南

图 3. Spring SecurityFilterChainProxy将请求分派到匹配的第一个链。

没有自定义安全配置的普通 Spring Boot 应用程序有几个(称为 n)过滤器链,其中通常 n=6。第一个 (n-1) 个链只是为了忽略静态资源模式,例如/css/**and/images/**和错误视图:/error. (路径可以由用户使用security.ignored配置SecurityPropertiesbean 控制。)最后一个链匹配包罗万象的路径 ( /**) 并且更加活跃,包含身份验证、授权、异常处理、会话处理、标头写入等逻辑上。默认情况下,该链中共有 11 个过滤器,但通常用户无需关心使用哪些过滤器以及何时使用。

容器不知道 Spring Security 内部的所有过滤器这一事实很重要,尤其是在 Spring Boot 应用程序中,默认情况下,所有@Beans类型Filter都自动注册到容器中。因此,如果您想将自定义过滤器添加到安全链中,则需要不将其设为 a@Bean或将其包装在FilterRegistrationBean明确禁用容器注册的 a 中。

创建和自定义过滤器链

Spring Boot 应用程序(具有请求匹配器的应用程序)中的默认后备过滤器链/**具有预定义的
SecurityProperties.BASIC_AUTH_ORDER. 您可以通过设置将其完全关闭security.basic.enabled=false,也可以将其用作后备并以较低的顺序定义其他规则。要执行后者,请添加一个(或)@Bean类型并用 装饰类,如下所示:
WebSecurityConfigurerAdapterWebSecurityConfigurer@Order

@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/match1/**")
     ...;
  }
}

这个 bean 导致 Spring Security 添加一个新的过滤器链并在回退之前对其进行排序。

与另一组相比,许多应用程序对一组资源的访问规则完全不同。例如,托管 UI 和支持 API 的应用程序可能支持基于 cookie 的身份验证,通过重定向到 UI 部分的登录页面和基于令牌的身份验证,以及对 API 部分的未经身份验证请求的 401 响应。每组资源都有自己
WebSecurityConfigurerAdapter的唯一顺序和自己的请求匹配器。如果匹配规则重叠,则最早排序的过滤器链获胜。

请求匹配调度和授权

安全过滤器链(或等效的 a
WebSecurityConfigurerAdapter)有一个请求匹配器,用于决定是否将其应用于 HTTP 请求。一旦决定应用特定的过滤器链,就不会应用其他过滤器链。但是,在过滤器链中,您可以通过在配置器中设置额外的匹配器来对授权进行更细粒度的控制HttpSecurity,如下所示:

@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/match1/**")
      .authorizeRequests()
        .antMatchers("/match1/user").hasRole("USER")
        .antMatchers("/match1/spam").hasRole("SPAM")
        .anyRequest().isAuthenticated();
  }
}

配置 Spring Security 时最容易犯的错误之一就是忘记这些匹配器适用于不同的进程。一种是整个过滤器链的请求匹配器,另一种只是选择要应用的访问规则。

将应用程序安全规则与执行器规则相结合

如果您将 Spring Boot Actuator 用于管理端点,您可能希望它们是安全的,并且默认情况下它们是安全的。事实上,只要将执行器添加到安全应用程序,您就会获得一个仅适用于执行器端点的附加过滤器链。它是使用仅匹配执行器端点的请求匹配器定义的,它的顺序为
ManagementServerProperties.BASIC_AUTH_ORDER,比默认的SecurityProperties回退过滤器少 5 个,因此在回退之前对其进行查询。

如果您希望您的应用程序安全规则应用于执行器端点,您可以添加一个比执行器更早排序的过滤器链,并且该过滤器链具有包含所有执行器端点的请求匹配器。如果您更喜欢执行器端点的默认安全设置,最简单的方法是在执行器之后添加您自己的过滤器,但在回退之前添加(例如,
ManagementServerProperties.BASIC_AUTH_ORDER + 1),如下所示:

@Configuration
@Order(ManagementServerProperties.BASIC_AUTH_ORDER + 1)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/foo/**")
     ...;
  }
}

Web 层中的 Spring Security 当前与 Servlet API 相关联,因此它仅在 servlet 容器中运行应用程序时才真正适用,无论是嵌入的还是其他的。但是,它不依赖于 Spring MVC 或 Spring Web 堆栈的其余部分,因此它可以在任何 servlet 应用程序中使用——例如,使用 JAX-RS 的应用程序。

方法安全

除了支持保护 Web 应用程序之外,Spring Security 还支持将访问规则应用于 Java 方法执行。对于 Spring Security,这只是一种不同类型的“受保护资源”。对于用户,这意味着使用相同格式的ConfigAttribute字符串(例如,角色或表达式)声明访问规则,但在代码中的不同位置。第一步是启用方法安全性——例如,在我们应用程序的顶层配置中:

@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SampleSecureApplication {
}

然后我们可以直接装饰方法资源:

@Service
public class MyService {

  @Secured("ROLE_USER")
  public String secure() {
    return "Hello Security";
  }

}

此示例是具有安全方法的服务。如果 Spring 创建了@Bean这种类型的 a,它会被代理,调用者必须在方法实际执行之前通过安全拦截器。如果访问被拒绝,调用者会得到一个AccessDeniedException而不是实际的方法结果。

您可以在方法上使用其他注释来强制实施安全约束,特别是@PreAuthorize@PostAuthorize,它们允许您编写分别包含对方法参数和返回值的引用的表达式。

将 Web 安全性和方法安全性结合起来并不少见。过滤器链提供用户体验功能,例如身份验证和重定向到登录页面等,方法安全性提供更细粒度的保护。

使用线程

Spring Security 基本上是线程绑定的,因为它需要使当前经过身份验证的主体可用于各种下游消费者。基本构建块是SecurityContext,它可能包含一个Authentication(当用户登录时,它是一个Authentication显式的authenticated)。您始终可以SecurityContext通过静态便捷方法访问和SecurityContextHolder操作ThreadLocal. 以下示例显示了这种安排:

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
assert(authentication.isAuthenticated);

用户应用程序代码执行此操作并不常见,但如果您需要编写自定义身份验证过滤器(尽管即使这样,Spring Security 中也有一些基类可供您使用,以便您可以避免需要使用SecurityContextHolder)。

如果您需要访问 Web 端点中当前经过身份验证的用户,可以在 a 中使用方法参数@RequestMapping,如下所示:

@RequestMapping("/foo")
public String foo(@AuthenticationPrincipal User user) {
  ... // do stuff with user
}

此注解将电流Authentication拉出SecurityContext并调用其上的getPrincipal()方法以产生方法参数。Principalin an的类型Authentication取决于AuthenticationManager用于验证身份验证的类型,因此这可能是一个有用的小技巧,可以获取对用户数据的类型安全引用。

如果使用 Spring Security,则PrincipalfromHttpServletRequest是 type Authentication,所以你也可以直接使用它:

@RequestMapping("/foo")
public String foo(Principal principal) {
  Authentication authentication = (Authentication) principal;
  User = (User) authentication.getPrincipal();
  ... // do stuff with user
}

如果您需要编写在不使用 Spring Security 时工作的代码,这有时会很有用(您需要在加载Authentication类时更加防御)。

异步处理安全方法

由于SecurityContext是线程绑定的,如果您想要执行任何调用安全方法的后台处理(例如, with @Async),您需要确保传播上下文。这归结为使用在后台执行SecurityContext的任务(Runnable、等)包装 。CallableSpring Security 提供了一些帮助程序来简化此操作,例如 和 的包装RunnableCallable。要传播SecurityContextto@Async方法,您需要提供AsyncConfigurer并确保其Executor类型正确:

@Configuration
public class ApplicationConfiguration extends AsyncConfigurerSupport {

  @Override
  public Executor getAsyncExecutor() {
    return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5));
  }

}

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68607
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14343
收藏 人收藏

    评论

    相关推荐

    言必信科技 电源滤波器的安全认证有哪些?

    电源滤波器需经安全认证以确保质量和用户安全,包括UL、CE、FCC、CCC等认证,涵盖电气安全、电磁兼容性等测试。制造商应遵守标准,选择合适
    的头像 发表于 11-15 14:41 201次阅读
    言必信科技 电源滤波器的<b class='flag-5'>安全</b><b class='flag-5'>认证</b>有哪些?

    Spring事务实现原理

    作者:京东零售 范锡军 1、引言 springspring-tx模块提供了对事务管理支持,使用spring事务可以让我们从复杂的事务处理中得到解脱,无需要去处理获得连接、关闭连接、事务提交和回滚等
    的头像 发表于 11-08 10:10 824次阅读
    <b class='flag-5'>Spring</b>事务实现原理

    复旦微荣获ISO26262:2018功能安全ASIL B产品认证证书

    安全架构设计及应对随机硬件指标失效风险方面符合ISO26262:2018ASILB级别的要求。复旦微电子集团MCU获得ASILB认证证书现场,复旦微电子集团股份有
    的头像 发表于 11-08 01:06 321次阅读
    复旦微荣获ISO26262:2018功能<b class='flag-5'>安全</b>ASIL B产品<b class='flag-5'>认证</b>证书

    增强BQ26100认证安全的方法

    电子发烧友网站提供《增强BQ26100认证安全的方法.pdf》资料免费下载
    发表于 09-11 09:43 1次下载
    增强BQ26100<b class='flag-5'>认证</b><b class='flag-5'>安全</b>的方法

    Spring Cloud Gateway网关框架

    Spring Cloud Gateway网关框架 本软件微服务架构中采用Spring Cloud Gateway网关控制框架,Spring Cloud Gateway是
    的头像 发表于 08-22 09:58 493次阅读
    <b class='flag-5'>Spring</b> Cloud Gateway网关框架

    再获突破!汇顶科技新一代安全芯片荣获CC EAL6+安全认证

    近日,汇顶科技新一代NFC+eSE安全芯片成功通过SOGIS CC EAL6+安全认证,成为国内首款在同类型产品中安全等级最高的产品。凭借这一成就,汇顶科技将以全球顶尖的
    发表于 08-20 14:19 438次阅读
    再获突破!汇顶科技新一代<b class='flag-5'>安全</b>芯片荣获CC EAL6+<b class='flag-5'>安全</b><b class='flag-5'>认证</b>

    OBOO鸥柏信发系统BS网络架构安全传输和访问控制的解决方案

    通信的网络应用方式,这种应用通常采用用户名和口令的机制进行简单的身份认证,中间传输的数据均是明文数据。目前这种B/S架构的网络应用系统缺乏一定的安全性,在建立的PK
    发表于 08-02 16:54 0次下载

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍Spring状态机之前,让我们来看看设计模式中的状态模式
    的头像 发表于 06-25 14:21 953次阅读
    玩转<b class='flag-5'>Spring</b>状态机

    英飞凌PSOC Edge E8x MCU系列获PSA最高安全认证

    在物联网(IoT)应用日益广泛的今天,嵌入式安全已成为保障设备稳定运行和数据安全的关键。英飞凌科技股份公司近日宣布,其新推出的PSOC™ Edge E8x MCU产品系列在设计上已满足嵌入式安全领域的最高标准——平台
    的头像 发表于 06-07 17:53 1745次阅读

    电热烤箱CCC认证前期资料准备与认证难点指南

    认证。电热烤箱当然也不例外。CCC认证是中国国家强制性产品认证的简称,也称为3C认证。这一认证对于产品质量和
    的头像 发表于 04-28 17:43 459次阅读
    电热烤箱CCC<b class='flag-5'>认证</b>前期资料准备与<b class='flag-5'>认证</b>难点<b class='flag-5'>指南</b>

    Codasip获得汽车功能安全和网络安全认证

    的领导者Codasip今天宣布,它已经获得了功能安全标准ISO 26262和网络安全工程标准ISO 21434的认证。Codasip的IP硬件工程开发流程、指南和工作说明已通过TÜV
    的头像 发表于 02-19 09:22 528次阅读

    如何设计和认证基于 RTD 的功能安全系统

    和高可靠性应用,通常需要通过 Route 1S 或 Route 2S 元器件认证流程来设计和确保实现功能安全系统。 由于必须审查系统中所有元器件的潜在故障模式和机理,因此对系统进行功能安全认证
    的头像 发表于 02-13 14:46 647次阅读
    如何设计和<b class='flag-5'>认证</b>基于 RTD 的功能<b class='flag-5'>安全</b>系统

    思特威获得DEKRA德凯ISO 26262 ASIL B功能安全产品认证证书

    获得ASIL B功能安全产品认证标志着思特威车规级CIS产品SC225AT/SC320AT的功能安全架构、设计实现及安全覆盖率均达到了全球公认的汽车功能安全标准ISO 26262 AS
    的头像 发表于 01-18 16:11 797次阅读
    思特威获得DEKRA德凯ISO 26262 ASIL B功能<b class='flag-5'>安全产品认证</b>证书

    SAFERTOS现已支持RISC-V架构安全应用

    WHIS是一家为汽车、医疗和工业领域提供实时操作系统(RTOS)和平台解决方案的安全系统公司。SAFERTOS是WHIS的安全关键预认证RTOS,已通过TÜV SÜD独立认证,符合IE
    的头像 发表于 01-12 11:17 838次阅读
    SAFERTOS现已支持RISC-V<b class='flag-5'>架构</b><b class='flag-5'>安全</b>应用

    Spring事务传播性的相关知识

    本文主要介绍了Spring事务传播性的相关知识。
    的头像 发表于 01-10 09:29 447次阅读
    <b class='flag-5'>Spring</b>事务传播性的相关知识