首页 文章 精选 留言 我的

精选列表

搜索[智博会],共10000篇文章
优秀的个人博客,低调大师

Fish Shell 采用 Rust 重写会导致性能下降

fish 是适用于 Linux、macOS 的命令行 Shell,其名字取于 "thefriendlyinteractiveshell" 的简称,最大特点就是方便易用、功能强大、智能并且用户友好。很多其他 Shell 需要配置才有的功能,fish 默认提供,不需要任何配置。 项目维护者 Fabian Boehm 今天在 GitHub 回应了使用 Rust 重写 Fish Shell的进度,称已几乎完成。 根据开发者的说法,他们已经完成了从 C++ 到 Rust 的大部分移植工作,但还有一些剩余的组件需要进行翻译。目前,他们正在处理与输入系统相关的读取器、屏幕处理、输入和分页器等强耦合组件。一旦这些组件完成翻译,剩下的工作就是一些零散的部分和去除构建系统的 C++ 依赖。 开发者表示,这不是一个适合临时贡献的项目,因为还有很多工作要做。 此外,开发者还回答了一些关于移植的问题和误解。他们表示不会删除所有的 C++ 代码,也没有计划移植到 Windows 平台。他们还表示不会更改 Fish Shell 的名称或吉祥物,并且对于最终移植的性能,他们表示早期结果是令人鼓舞的,但可能在某些情况下会比现有版本慢约 20%。 最后,他们提到即使完成了初始移植工作,项目也还有很多工作要做。 来源:https://github.com/fish-shell/fish-shell/discussions/10123

优秀的个人博客,低调大师

WebFlux 和 Spring Security 会碰出哪些火花?

WebFlux 系列松哥已经连着写了十几篇了,Spring Security 系列之前更是发了 68 篇(公号后台回复 ss 获取系列教程),不过之前这两个教程都是分开讲的,还没有把这两个融合到一起讲过。 随着 WebFlux 的发展,我们有必要来了解下在响应式编程中如何使用 Spring Security。今天松哥就通过一个简单的案例来和大家分享下如何在 WebFlux 中使用 Spring Security。 1.基于内存的使用 先来看一个简单的,就是把用户信息保存在内存中。 首先我们来创建一个新的项目,引入 WebFlux 和 Spring Security 依赖,如下: 项目创建成功后,我们添加一个接口,用来获取登录用户信息,如下: @RestController public class UserController { @GetMapping("/user") public Mono<Principal> getCurrentUser(Mono<Principal> principal) { return principal; } } 注意我们的返回值是 Mono<Principal>,接口的参数也是支持 Mono<Principal> 的。 这就可以了,接下来我们启动项目,在启动的过程中,控制台就会打印出默认的用户密码,拿着默认的用户密码以及默认用户名 user 去登录,登录完成后就可以访问 /user 接口了,这个过程和普通的 Spring Security 用法并没有什么差异,所以我就不多说了,如果大家对普通的 Spring Security 用法还不熟悉,也可以看看松哥的新书《深入浅出 Spring Security》。 如果我们想配置基于内存的用户信息,该怎么配置呢?添加如下配置类即可: @Configuration public class SecurityConfig { @Bean MapReactiveUserDetailsService mapReactiveUserDetailsService() { UserDetails ud1 = User.withUsername("admin") .password("{noop}123") .roles("admin") .build(); UserDetails ud2 = User.withUsername("zhangsan") .password("{noop}123") .roles("user") .build(); return new MapReactiveUserDetailsService(ud1, ud2); } } 只需要提供一个 MapReactiveUserDetailsService 实例即可。 MapReactiveUserDetailsService 实现了 ReactiveUserDetailsService 接口,ReactiveUserDetailsService 接口其实就跟我们以前的 UserDetailsService 接口的作用差不多;而 MapReactiveUserDetailsService 则类似于我们以前的 InMemoryUserDetailsManager,都是基于内存来管理用户的,理解了这一层,剩下的东西就好懂了。 我们在 MapReactiveUserDetailsService 中提供两个用户对象即可。 最后启动项目,此时 IDEA 控制台就不会输出默认生成的密码了,这个时候我们就可以直接使用 admin/123 或者 user/123 来进行登录了。 2.基于数据库的使用 第一小节我们是在内存中配置用户,真正到了开发中我们还是需要从数据库中读取用户数据,所以接下来我们再来看一个基于数据库的配置。 首先我们先来大概看一眼数据库: 首先我们创建项目,这个时候要添加的依赖就比较多,除了 WebFlux 和 Spring Security 之外,还有 R2DBC 以及 MySQL 驱动,如下: 项目创建成功之后,在 application.properties 中配置数据库基本信息,如下: spring.r2dbc.url=r2dbcs:mysql://localhost:3306/test01 spring.r2dbc.username=root spring.r2dbc.password=123 如此之后,我们的准备工作就算完成了。 接下来我们创建 User 的实体类,老规矩,User 类需要实现 UserDetails 接口: public class User implements UserDetails { @Id private Long id; private String username; private String address; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 接下来创建 UserRepository: public interface UserRepository extends ReactiveCrudRepository<User,Long> { Mono<UserDetails> findUserByUsername(@Param("username") String username); } 增加了一个 findUserByUsername 方法,用来根据用户名查找用户对象。 接下来定义 UserService,这次需要我们自己实现 ReactiveUserDetailsService 接口,如下: @Service public class UserService implements ReactiveUserDetailsService { @Autowired UserRepository userRepository; @Override public Mono<UserDetails> findByUsername(String username) { return userRepository.findUserByUsername(username); } } UserService 实现了 ReactiveUserDetailsService 接口,并重写了 findByUsername 方法,这个类似于我们之前重写 UserDetailsService#loadUserByUsername 方法。 这里记得将 UserService 注册到 Spring 容器中,接下来就不需要额外的工作了。 配置完成了。 接下来我们启动项目,此时就可以通过数据库中的用户进行登录了。 3.小结 好啦,今天就通过两个简单的小案例,带领小伙伴们体验下 WebFlux+Spring Security 的用法,当然这里还有很多使用细节,在接下来的文章中松哥再和大家一一介绍。

优秀的个人博客,低调大师

Linux基金会推出免费代码签名服务

Linux Foundation、Red Hat、Google和Purdue近日推出了免费的“sigstore”代码签名服务,该服务使开发人员可以对开放源代码进行代码签名和验证,以防止供应链攻击。 正如最近的依赖关系混淆攻击和恶意NPM软件包所展示的,越来越多的供应链攻击开始瞄准开源生态系统。 攻击者将开发恶意开源程序包,并使用与流行的合法程序包相似的名称将其上传到公共存储库。如果开发人员错误地将恶意软件包包含在自己的项目中,则在开发项目时将自动执行恶意代码。 Sigstore的推出,就是为了防止此类型的攻击。“sigstore”是一种免费使用的非盈利性软件签名服务,允许开发人员对开源软件进行签名并验证其真实性。 “您可以将Sigstore看作是类似Let's Encrypt的免费HTTPS证书和自动化工具,sigstore也提供免费的证书和工具来自动化和验证源代码的签名。”谷歌在博客中介绍说:“Sigstore还支持透明日志,这意味着所有证书和证明都是全球可见、可发现和可审计的。” Sigstore的构建基于OpenID Connect短期证书、公共透明日志和为代码签名分配的特殊Root CA证书。 参考资料: https://security.googleblog.com/2021/03/introducing-sigstore-easy-code-signing.html 【本文是51CTO专栏作者“安全牛”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文 【责任编辑:赵宁宁 TEL:(010)68476606】 点赞 0

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册