如何在2016年不再憎恨Spring

工程 | Phil Webb | 2015年11月29日 | ...

在感恩节周末,一篇2014年的文章《我为什么憎恨Spring》由Sam Atkinson撰写,开始在Twitter上传播。倾听批评意见总是很有趣的,可以让我们看到如何改进Spring,Spring Boot的诞生很大程度上就是源于倾听人们谈论在使用该框架时遇到的问题

在本篇博文中,我将尝试解决 Sam 文章中讨论的一些问题,并描述我个人的 Spring“最佳实践”。不过,在深入探讨细节之前,值得考虑一下为什么不太理想的做法仍然存在于…

将 Spring Cloud 应用从 Spring Boot 1.2 迁移到 1.3

工程 | Dave Syer | 2015年11月25日 | ...

在 Brixton 版本系列的 Spring Cloud 中,Spring Boot 1.3 中有一些非常棒的新功能。Angel 版本系列的 Spring Cloud 与 Spring Boot 1.3 部分不兼容,因此在升级时有一些重要的事情需要注意。本文将帮助您了解这些变化,并更新现有应用程序以使用这些新功能。对于尝试将 Spring 项目的新版本集成到现有代码库中,本文通常也会有所帮助。

提示:您可以使用 mvn dependency:treegradle dependencies 来列出项目中的依赖项并检查版本。

本周 Spring - 2015 年 11 月 23 日

工程 | Josh Long | 2015 年 11 月 24 日 | ...

欢迎来到又一期本周 Spring!在美国,现在是感恩节周,希望我们都能花点时间留意那些值得我们感恩的事物。我敢肯定,代表 Pivotal 的整个团队,我要说:我们感谢您,亲爱的社区。谢谢您。

因此,照例,我们有很多内容要介绍。事实上,这对于火鸡后的懒散时光来说再好不过了!

  • Dr. Mark Pollack 刚刚宣布发布了 Spring XD 1.3 GA 和 Spring Flo for Spring XD 1.0。这是一个重大的版本!Spring XD 1.3.0 支持作业组合 DSL、Spring Flo for Spring XD、改进的 Admin UI、Spark 1.3.1、Spring Data 和 Spring for Hadoop 分发行情的更新、Cassandra Sink 以及更多!这是 Spring XD 在完成其向 Spring Cloud Stream 和 Spring Cloud Dataflow 中已部分规划的架构迁移之前的最后一个版本!这是该技术令人兴奋的演进!
  • Spring Security 和 Spring Session 的负责人 Rob Winch 刚刚宣布了 Spring Session 1.1.0.M1,其中包含许多新功能:按用户名搜索 HTTP 会话、支持 HttpSessionListener、自定义 Cookie 创建、覆盖默认 RedisSerializer

Spring XD 1.3 GA 和 Flo for Spring XD 1.0 GA 发布

工程 | Mark Pollack | 2015 年 11 月 19 日 | ...

今天我们很高兴宣布 Spring XD 1.3 和 Flo for Spring XD 1.0 正式发布。

  • Spring XD 1.3 GA:zipbrewrpm
  • Flo for Spring XD 1.0 GA:zip

除了 bug 修复外,我们还在 1.3 版本系列中添加了几个新功能。

  • 作业组合 DSL 允许创建复杂的作业执行图。
  • Flo for Spring XD 设计器支持创建组合作业
  • Admin UI 支持组合作业的执行历史。
  • Cassandra Sink 和 Header Enricher Processor (Cassandra SinkHeader Enricher Processor)
  • Gpfdist sink 现在支持更新操作和完整的控制文件选项 (Gpfdist sink 现在支持更新操作和完整的控制文件选项)
  • Spark 1.3.1 支持
  • 为刷新到 HDFS 的写入设置超时值,以确保数据持久化到 HDFS DataNode 的磁盘。
  • 通用依赖升级,Spring Data Gosling,SI 4.2,以及 Boot 1.2

本周 Spring - 2015 年 11 月 17 日

工程 | Josh Long | 2015年11月17日 | ...

天哪,时间过得真快!我们已经迈入 2016 年的开端了!

欢迎来到又一期本周 Spring!本周我人在美丽的摩洛哥卡萨布兰卡参加 Devoxx Morocco!这是今年的第五届 Devoxx - 分别在比利时、英国、法国、波兰以及现在的摩洛哥 - 我有幸参加了所有这些活动!#fullDevoxx

本周内容很多,让我们开始吧!

本周 Spring - 2015年11月10日

工程 | Josh Long | 2015年11月10日 | ...

欢迎收看又一期的《本周 Spring》!本周我正在比利时安特卫普参加盛大的 Devoxxes(Devoxxen?),Devoxx Belgium!我和团队的几位成员都在这里, 如果你也在附近,请尽管打个招呼

本周 Spring (PCF 1.6 版!) - 2015 年 11 月 3 日

工程 | Josh Long | 2015年11月03日 | ...

欢迎来到又一期本周 Spring!本周我人在保加利亚索非亚参加我最喜欢的活动之一,史诗级的 Java2Days 会议

上周,我们(终于!)发布了 **Pivotal Cloud Foundry 1.6**,其中包含了超过一年半的备受期待的功能和大量的改进。新版本包括(以及更多)对平台管理的 GitLab、JFrog Artifactory 和 CloudBees Jenkins CI 的支持;对包括 Spring Cloud Config Server 和 Spring Cloud Eureka 在内的微服务基础设施的支持;以及对 Docker 容器镜像和 .NET 应用程序的支持;以及在 Microsoft Azure 上运行的支持。此版本集成了各种功能,旨在优化软件在生产环境中的持续安全交付,我…

本周 Spring (JavaOne 2015 版) - 2015 年 10 月 27 日

工程 | Josh Long | 2015年10月28日 | ...

欢迎来到又一期本周 Spring!本周我和 Pivotal 的其他团队成员都在旧金山的 JavaOne 2015 会议上。本周 Pivotal Spring 团队将全力出动,快来拜访我们吧!

本周有几场精彩的 SpringOne2GX 2015 录播视频以及一些很棒的社区内容,让我们开始吧!

React.js and Spring Data REST: 第 5 部分 - 安全性

工程 | Greg L. Turnquist | 2015年10月28日 | ...
要查看此代码的更新,请访问我们的 React.js 与 Spring Data REST 教程

上一节中,您通过 Spring Data REST 内置的事件处理程序和 Spring 框架的 WebSocket 支持,使应用程序能够动态响应其他用户的更新。但是,没有哪个应用程序在不进行安全保护的情况下是完整的,这样只有适当的用户才能访问 UI 及其背后的资源。

欢迎随时从此存储库获取代码并进行跟随。本节基于上一节的应用程序,并添加了一些额外内容。

向项目中添加 Spring Security

在开始之前,您需要将几个依赖项添加到项目的 pom.xml 文件中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

这引入了 Spring Boot 的 Spring Security starter 以及一些额外的 Thymeleaf 标签,用于在网页中进行安全查找。

定义安全模型

在上一节中,您使用了一个不错的薪资系统。在后端声明内容并让 Spring Data REST 完成繁重的工作非常方便。下一步是构建一个需要实施安全控制的系统模型。

如果这是一个薪资系统,那么只有经理才能访问它。所以,让我们通过建模一个Manager对象来开始

@Data
@ToString(exclude = "password")
@Entity
public class Manager {
public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();

private @Id @GeneratedValue Long id;

private String name;

private @JsonIgnore String password;

private String[] roles;

public void setPassword(String password) {
	this.password = PASSWORD_ENCODER.encode(password);
}

protected Manager() {}

public Manager(String name, String password, String... roles) {

	this.name = name;
	this.setPassword(password);
	this.roles = roles;
}

}

  • PASSWORD_ENCODER是用于加密新密码或接收密码输入并在比较之前对其进行加密的机制。
  • idnamepasswordroles定义了限制访问所需的参数。
  • 自定义的setPassword()确保密码永远不会以明文形式存储。

在设计安全层时,有一点很重要需要牢记。保护好数据(如密码),并且绝对不要让它们打印到控制台、日志中,或通过 JSON 序列化导出。

  • @ToString(exclude = "password")确保 Lombok 生成的 toString() 方法不会打印密码。
  • 应用于 password 字段的@JsonIgnore可以防止 Jackson 序列化此字段。

创建经理的存储库

Spring Data 在管理实体方面非常出色。为什么不创建一个存储库来处理这些经理呢?

@RepositoryRestResource(exported = false)
public interface ManagerRepository extends Repository<Manager, Long> {
Manager save(Manager manager);

Manager findByName(String name);

}

您不需要那么多方法,而是扩展了通常的CrudRepository。相反,您需要保存数据(也用于更新),并且需要查找现有用户。因此,您可以使用 Spring Data Common 的最小化Repository标记接口。它没有预定义的任何操作。

默认情况下,Spring Data REST 会导出它找到的任何存储库。您绝对不想将此存储库暴露给 REST 操作!应用@RepositoryRestResource(exported = false)注解来阻止其导出。这可以防止存储库被提供服务,以及任何元数据。

将员工与其经理关联

建模安全性的最后一步是将员工与其经理关联。在此域中,一个员工可以有一个经理,而一个经理可以有多个员工。

@Data
@Entity
public class Employee {
private @Id @GeneratedValue Long id…

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有