应用安全属于安全防护体系中的重要一环,但也是最薄弱的一环,究其原因,或许是应用的核心职责是完成业务和产品的功能需求,而安全确实非功能性需求,在资源有限的情况下,企业一定是更加注重将有限的资源投入到“开疆扩土”上去,否则,穷家破瓦的,也真没有什么值得安全防护的。
大部分应用开发者对应用安全知之甚少,而且安全一般属于一个企业或者业界秘而不宣的信息,所以,在没有一个专职的安全团队负责推动整个安全防护体系落实的情况下,零零散散和线上落实的一些应用安全防护已经算很不错的了。
“树大招风”,树不大的时候,那些“风”通常也不会来找你麻烦,所以,大部分中小企业,除非应用了一些业界广泛应用的软件或者方案被连带性地伤害到,大部分情况下,这些中小企业并不知道这类潜在风险,或者是他们自身不会为黑客们(cracker)带来太大的利用价值。
好在 Java 开发者生活在 Spring 框架营造的生态圈之中,所以,关于应用安全这种头疼的问题,Spring 生态圈里也有现成的解决方案,即从 Acegi 发展起来的 SpringSecurity。
但是说实话,SpringSecurity 在整个社区中的名声并不是太好,尤其是在开发者眼中,“复杂(Too Complicated),太重(Too Heavyweight)”,但实际上,如果大家真得去了解一个框架,就会发现,其实 SpringSecurity 框架本身的设计还是挺优秀的。
SpringSecurity 可以任意裁剪,而且还提供了丰富的开箱即用的安全特性支持。这里其实存在一个常见的设计取舍,我们到底应该为了良好的扩展和组合型而将组件拆分的精细一些,还是应该为了使用的便利,适度忽略定制化的需求,提供一个功能简化的一站式方案?
不管 SpringSecurity 团队当时是如何选择的,既然已经成为了事实,给使用者的感受不好,那么,我们就要想办法改善这种现状,spring-boot-starter-security 就是一种答案。
spring-boot-starter-security 主要面向 Web 应用安全,配合 spring-boot-starter-web,要使用 SpringBoot 构建一个安全的对外提供服务的 Web 应用简直太容易了,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.keevol.unveilspring.chapter3</groupId>
<artifactId>web-security-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>web-security-demo</name>
<description>web security demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>