前言
在深入了解Spring Security的相关功能之后,一直陷入了深深的纠结之中:是一片长文搞定,还是再搞个专栏。
终于,用上了AI后,不再纠结怎么排版内容了。自此,我也明白了,饭要一口一口吃。
Spring Security概述
官方概述
Spring Security是一款提供认证、授权、以及针对常见(网络)攻击的防御的框架。它为保护命令式和反应式应用程序提供了一流的支持,是保护基于Spring的应用程序的事实标准。
- 从官方的介绍,我们可以看到他就是为基于Spring的应用量身定制的。这也是为什么我们如果使用Spring MVC/Spring Boot继承Spring Security如此丝滑的原因。
- 三个关键词:认证、授权、以及针对常见(网络)攻击的防御
记住着三个关键词,因为他直接代表着Spring Security提供的三大核心功能/特性。
Why Spring Security
Spring Security的特性
Spring Security的三个关键词就是他的特性。
- Authentication-认证:Spring Security提供通用的登录认证功能,同时支持Servlet应用,也能支持WebFlux这种响应式应用。
- Authorization-授权:Spring Security为授权提供了全面的支持。同时支持基于Request的授权和基于方法的授权。
- Protection Against Exploits-防范漏洞:结合常见的防范手段,提供支持:
- Cross Site Request Forgery:跨域请求伪造
- Response Header:提供通用的响应头设置,为功能性、常见的网络安全响应头提供支持,同时设置默认的请求头。
- Request Header: 通过请求头可将http请求强制使用https.
要回答这个问题,就不得不对比一下另一款流行的安全框架:Shiro
框架的使用层面
|
Spring Security |
Shiro |
集成难易度 |
与Spring框架无缝集成,可以很方便地与其他Spring组件一起使用 |
需要与Spring进行整合开发,但配置和使用都比较简单 |
活跃度和资源 |
庞大的社区资源和文档支持,有大量使用案例和文档可供参考 |
活跃的社区,为开发者提供交流和帮助平台 |
依赖性 |
依赖于Spring容器 |
不依赖于任何框架或容器,可以独立运行 |
使用复杂度 |
功能丰富,使用起来可能稍微复杂一些 |
API设计简洁,易于理解和使用 |
定制性 |
支持自定义安全注解和编程式访问控制,可根据项目需求进行定制化开发 |
提供简洁的API和高度灵活性,可根据项目需求进行定制化开发 |
性能 |
性能表现良好,具体性能因使用场景而异 |
在缓存等方面可能具有更好的性能表现 |
功能对比层面
功能 |
Spring Security |
Shiro |
身份认证 |
支持多种身份认证机制,包括基于表单、HTTP Basic和HTTP Digest等 |
提供多种身份认证机制,包括基于表单、HTTP Basic和HTTP Digest等 |
授权 |
支持注解和配置文件定义访问控制策略,支持基于表达式的访问控制 |
提供丰富的授权功能,可以使用注解或配置文件定义访问控制策略 |
会话管理 |
支持会话管理功能,包括跨站点请求伪造(CSRF)保护和会话失效时间设置等 |
提供会话管理功能,但需要开发者自行实现跨站点请求伪造(CSRF)保护等安全特性 |
异常处理 |
提供内置的异常处理机制。提供跳转到登录前的请求,也可配置跳转到指定页面 |
提供内置的异常处理机制。定制登录成功后的跳转请求提供一定的支持,但需要自行实现完整功能 |
RememberMe功能 |
支持RememberMe功能,可以轻松实现用户自动登录 |
提供RememberMe功能,可以轻松实现用户自动登录 |
丰富的安全特性 |
提供了多层安全防护,包括认证、授权、加密等,可以有效保护Web应用程序的安全。还提供了防止跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等安全特性。 |
提供了身份验证、授权、加密和会话管理等安全功能,但可能没有Spring Security那么丰富的安全特性。 |
概括来说就是:
Spring Security的提供了很多丰富的安全特性,这点除了在上述的功能对比上体现,也体现在三大关键词之一的:应对常见攻击的防御上。同时,可以无缝继承到Spring的应用。
而Shiro主要突出一个短小精干,虽然没有Spring Security的安全特性,但是登录认证、授权都支持。而且使用更加简单、也更容易上手,他甚至做到可以基于配置文件进行配置,这是Spring Security无法做到的。
小结
综上所述,选择哪一个框架需要根据你的项目需求来决定。
- 如果你希望拥有一个提供多种开箱即用的安全特性的强大的安全框架,又或者希望能够快速与Spring进行集成的安全框架,那么Spring Security是你的不二选择。
- 如果你需要一个轻量级、简单易用、易上手的安全框架,或者不依赖于特定框架或容器,那么Shiro可能更适合你。
Quick Start
官方也提供了一些Demo,最简单的是spring-security-samples里面的/servlet/spring-boot/java/hello-security-explicit
从构建的角度简单给大家说说
引入maven依赖
由于个人用惯了maven,就不说gradle哈。
<properties>
<!-- spring boot 3.x版本需要Java 17才能运行 -->
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>3.1.6</spring-boot.version>
</properties>
<!-- 指定springboot版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 引入Spring Security的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 引入Spring Web的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入视图模板引擎的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置过滤器链条
这里就直接拿过来了
package example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
.httpBasic(withDefaults())
.formLogin(withDefaults());
return http.build();
}
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
这样,我们就搭建好了第一个简单的Spring Security工程。
在浏览器,输入:http://localhost:8080/login,就进入登录页面了。
然后,输入我们配置的用户名:user,密码:password,点击登录就进入首页了。
后记
本节最重要的内容是介绍Spring Security。如果你搞明白了什么场景需要选择他,那么你就掌握这节的重点内容。
请给文章点个赞,也给你自己点个赞。下一节,我们将聊聊关于授权和认证的相关概念.