如何在2016年不再憎恨Spring
在感恩节周末,一篇2014年的文章《我为什么憎恨Spring》由Sam Atkinson撰写,开始在Twitter上传播。倾听批评意见总是很有趣的,可以让我们看到如何改进Spring,Spring Boot的诞生很大程度上就是源于倾听人们谈论在使用该框架时遇到的问题。
在本篇博文中,我将尝试解决 Sam 文章中讨论的一些问题,并描述我个人的 Spring“最佳实践”。不过,在深入探讨细节之前,值得考虑一下为什么不太理想的做法仍然存在于…
在感恩节周末,一篇2014年的文章《我为什么憎恨Spring》由Sam Atkinson撰写,开始在Twitter上传播。倾听批评意见总是很有趣的,可以让我们看到如何改进Spring,Spring Boot的诞生很大程度上就是源于倾听人们谈论在使用该框架时遇到的问题。
在本篇博文中,我将尝试解决 Sam 文章中讨论的一些问题,并描述我个人的 Spring“最佳实践”。不过,在深入探讨细节之前,值得考虑一下为什么不太理想的做法仍然存在于…
在 Brixton 版本系列的 Spring Cloud 中,Spring Boot 1.3 中有一些非常棒的新功能。Angel 版本系列的 Spring Cloud 与 Spring Boot 1.3 部分不兼容,因此在升级时有一些重要的事情需要注意。本文将帮助您了解这些变化,并更新现有应用程序以使用这些新功能。对于尝试将 Spring 项目的新版本集成到现有代码库中,本文通常也会有所帮助。
提示:您可以使用
…mvn dependency:tree或gradle dependencies来列出项目中的依赖项并检查版本。
欢迎来到又一期本周 Spring!在美国,现在是感恩节周,希望我们都能花点时间留意那些值得我们感恩的事物。我敢肯定,代表 Pivotal 的整个团队,我要说:我们感谢您,亲爱的社区。谢谢您。
因此,照例,我们有很多内容要介绍。事实上,这对于火鸡后的懒散时光来说再好不过了!
HttpSessionListener、自定义 Cookie 创建、覆盖默认 RedisSerializer…今天我们很高兴宣布 Spring XD 1.3 和 Flo for Spring XD 1.0 正式发布。
除了 bug 修复外,我们还在 1.3 版本系列中添加了几个新功能。
天哪,时间过得真快!我们已经迈入 2016 年的开端了!
欢迎来到又一期本周 Spring!本周我人在美丽的摩洛哥卡萨布兰卡参加 Devoxx Morocco!这是今年的第五届 Devoxx - 分别在比利时、英国、法国、波兰以及现在的摩洛哥 - 我有幸参加了所有这些活动!#fullDevoxx
本周内容很多,让我们开始吧!
欢迎收看又一期的《本周 Spring》!本周我正在比利时安特卫普参加盛大的 Devoxxes(Devoxxen?),Devoxx Belgium!我和团队的几位成员都在这里, 如果你也在附近,请尽管打个招呼!
欢迎来到又一期本周 Spring!本周我人在保加利亚索非亚参加我最喜欢的活动之一,史诗级的 Java2Days 会议!
上周,我们(终于!)发布了 **Pivotal Cloud Foundry 1.6**,其中包含了超过一年半的备受期待的功能和大量的改进。新版本包括(以及更多)对平台管理的 GitLab、JFrog Artifactory 和 CloudBees Jenkins CI 的支持;对包括 Spring Cloud Config Server 和 Spring Cloud Eureka 在内的微服务基础设施的支持;以及对 Docker 容器镜像和 .NET 应用程序的支持;以及在 Microsoft Azure 上运行的支持。此版本集成了各种功能,旨在优化软件在生产环境中的持续安全交付,我…
Flo for Batch 流水线建立在 Spring XD 中新支持的 Batch DSL 之上,该 DSL 可用于创建包含顺序、并行甚至两者组合的复合批处理工作流。
欢迎来到又一期本周 Spring!本周我和 Pivotal 的其他团队成员都在旧金山的 JavaOne 2015 会议上。本周 Pivotal Spring 团队将全力出动,快来拜访我们吧!
本周有几场精彩的 SpringOne2GX 2015 录播视频以及一些很棒的社区内容,让我们开始吧!
| 要查看此代码的更新,请访问我们的 React.js 与 Spring Data REST 教程。 |
在上一节中,您通过 Spring Data REST 内置的事件处理程序和 Spring 框架的 WebSocket 支持,使应用程序能够动态响应其他用户的更新。但是,没有哪个应用程序在不进行安全保护的情况下是完整的,这样只有适当的用户才能访问 UI 及其背后的资源。
在开始之前,您需要将几个依赖项添加到项目的 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是用于加密新密码或接收密码输入并在比较之前对其进行加密的机制。id、name、password和roles定义了限制访问所需的参数。自定义的setPassword()确保密码永远不会以明文形式存储。
在设计安全层时,有一点很重要需要牢记。保护好数据(如密码),并且绝对不要让它们打印到控制台、日志中,或通过 JSON 序列化导出。
@ToString(exclude = "password")确保 Lombok 生成的 toString() 方法不会打印密码。@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…