spring-boot-starter-security与应用安全

  • 内容
  • 评论
  • 相关

应用安全属于安全防护体系中的重要一环,但也是最薄弱的一环,究其原因,或许是应用的核心职责是完成业务和产品的功能需求,而安全确实非功能性需求,在资源有限的情况下,企业一定是更加注重将有限的资源投入到“开疆扩土”上去,否则,穷家破瓦的,也真没有什么值得安全防护的。

大部分应用开发者对应用安全知之甚少,而且安全一般属于一个企业或者业界秘而不宣的信息,所以,在没有一个专职的安全团队负责推动整个安全防护体系落实的情况下,零零散散和线上落实的一些应用安全防护已经算很不错的了。

“树大招风”,树不大的时候,那些“风”通常也不会来找你麻烦,所以,大部分中小企业,除非应用了一些业界广泛应用的软件或者方案被连带性地伤害到,大部分情况下,这些中小企业并不知道这类潜在风险,或者是他们自身不会为黑客们(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>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency> <!--其他依赖 -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project> 

在当前项目中只要添加需要的 Controller 实现,一个添加了基本安全防护的 Web 应用就诞生了。spring-boot-starter-security 默认会提供一个基于 HTTP Basic 认证的安全防护策略,默认用户名为 user,访问密码则在当前 Web 应用启动的时候,打印到控制台,类似于:

2017-01-01 13:57:00.596 INFO 17966 --- [ost-startStop-1] b.a.s.Au-thenticationManagerConfiguration : Using default security password: 560ff91b-0ae7-492c-ad16-603e1adec54c 

如果我们希望对 HTTP Basic 认证的用户名和密码进行定制,可以通过如下配置项进行:

security.user.name={个人希望设置的用户名}
security.user.password={个人希望使用的访问密码} 

除此之外,spring-boot-starter-security 还会默认启用一些必要的 Web 安全防护,比如针对 XSS、CSRF 等常见针对 Web 应用的攻击,同时,也会将一些常见的静态资源路径排除在安全防护之外。

但是,说实话,spring-boot-starter-security 提供的默认安全策略相对于真正的生产环境来说,还是太弱了。但也没办法,既要安全,又要便利,spring-boot-starter-security 默认情况下已经尽量做到够好了。

不过好在 SpringSecurity 扩展性不错,要在其上构建一套真正严谨有效的 Web 应用安全防护体系也并非难事,只不过,需要我们先能够从其架构设计上理解并把握它,然后再在 SpringSecurity 和 SpringBoot 的基础上构建一套符合自身需要的 Web 应用安全方案。

了解 SpringSecurity 基本设计

SpringSecurity 框架不但囊括了基本的认证和授权功能,而且还提供了加密解密、统一登录等一系列相关支持,本教程中只是对框架比较核心的设计进行简单介绍,即基本的认证和授权为核心的设计。

我们可以将 Spring Security 的几个核心概念按照图 1 所示勾勒在一起:

SpringSecurity核心概念示意图
图 1  SpringSecurity 核心概念示意图

本文标题:spring-boot-starter-security与应用安全

本文地址:https://www.hosteonscn.com/6090.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注