# 28. 安全

如果添加了Spring Security的依赖，那么web应用默认对所有的HTTP路径（也称为终点，端点，表示API的具体网址）使用'basic'认证。为了给web应用添加方法级别（method-level）的保护，你可以添加`@EnableGlobalMethodSecurity`并使用想要的设置，其他信息参考[Spring Security Reference](http://docs.spring.io/spring-security/site/docs/4.1.3.RELEASE/reference/htmlsingle#jc-method)。

默认的`AuthenticationManager`只有一个用户（'user'的用户名和随机密码会在应用启动时以INFO日志级别打印出来），如下：

```java
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
```

**注** 如果你对日志配置进行微调，确保`org.springframework.boot.autoconfigure.security`类别记录日志级别为`INFO`，否则默认的密码不会打印出来。

你可以通过设置`security.user.password`改变默认密码，这些和其他有用的属性通过[SecurityProperties](https://github.com/spring-projects/spring-boot/tree/v1.4.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityProperties.java)（以"security"为前缀的属性）被外部化了。

默认的安全配置是通过`SecurityAutoConfiguration`，`SpringBootWebSecurityConfiguration`（用于web安全），`AuthenticationManagerConfiguration`（可用于非web应用的认证配置）进行管理的。你可以添加一个`@EnableWebSecurity` bean来彻底关掉Spring Boot的默认配置。为了对它进行自定义，你需要使用外部的属性配置和`WebSecurityConfigurerAdapter`类型的beans（比如，添加基于表单的登陆）。 想要关闭认证管理的配置，你可以添加一个`AuthenticationManager`类型的bean，或在`@Configuration`类的某个方法里注入`AuthenticationManagerBuilder`来配置全局的`AuthenticationManager`。这里有一些安全相关的[Spring Boot应用示例](https://github.com/spring-projects/spring-boot/tree/v1.4.1.RELEASE/spring-boot-samples/)可以拿来参考。

在web应用中你能得到的开箱即用的基本特性如下：

1. 一个使用内存存储的`AuthenticationManager` bean和一个用户（查看`SecurityProperties.User`获取user的属性）。
2. 忽略（不保护）常见的静态资源路径（`/css/**, /js/**, /images/**`，`/webjars/**`和 `**/favicon.ico`）。
3. 对其他所有路径实施HTTP Basic安全保护。
4. 安全相关的事件会发布到Spring的`ApplicationEventPublisher`（成功和失败的认证，拒绝访问）。
5. Spring Security提供的常见底层特性（HSTS, XSS, CSRF, 缓存）默认都被开启。

上述所有特性都能通过外部配置（`security.*`）打开，关闭，或修改。想要覆盖访问规则而不改变其他自动配置的特性，你可以添加一个注解`@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)`的`WebSecurityConfigurerAdapter`类型的`@Bean`。

**注** `WebSecurityConfigurerAdapter`默认会匹配所有路径，如果不想完全覆盖Spring Boot自动配置的访问规则，你可以精确的配置想要覆盖的路径。
