在深入了解Spring Security的相关功能之后,一直陷入了深深的纠结之中:是一片长文搞定,还是再搞个专栏。
终于,用上了AI后,不再纠结怎么排版内容了。自此,我也明白了,饭要一口一口吃。
Spring Security是一款提供认证、授权、以及针对常见(网络)攻击的防御的框架。它为保护命令式和反应式应用程序提供了一流的支持,是保护基于Spring的应用程序的事实标准。
记住着三个关键词,因为他直接代表着Spring Security提供的三大核心功能/特性。
Spring Security的三个关键词就是他的特性。
要回答这个问题,就不得不对比一下另一款流行的安全框架: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无法做到的。
综上所述,选择哪一个框架需要根据你的项目需求来决定。
官方也提供了一些Demo,最简单的是spring-security-samples里面的/servlet/spring-boot/java/hello-security-explicit
从构建的角度简单给大家说说
由于个人用惯了maven,就不说gradle哈。
17
17
17
UTF-8
UTF-8
3.1.6
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-thymeleaf
这里就直接拿过来了
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;
/**
* @EnableWebSecurity:开启Spring Secuirty
*
* @author Rob Winch
*/
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// 这里配置的每一个http的方法,都在配置一个过滤器
// @formatter:off
http
// 引入AuthorizationFilter
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
// 引入BasicAuthenticationFilter,意味着支持基于Basic进行认证
.httpBasic(withDefaults())
// 引入UsernamePasswordAuthenticationFilter
.formLogin(withDefaults());
// @formatter:on
// 构建安全过滤器链
return http.build();
}
// @formatter:off
@Bean
public InMemoryUserDetailsManager userDetailsService() {
// 为了简单演示,提供基于内存的用户信息
// 生成的用户密码使用bcrypt进行加密存储
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
// 这个家伙实现了UserDetailsService
return new InMemoryUserDetailsManager(user);
}
// @formatter:on
}
这样,我们就搭建好了第一个简单的Spring Security工程。
在浏览器,输入:http://localhost:8080/login,就进入登录页面了。
然后,输入我们配置的用户名:user,密码:password,点击登录就进入首页了。
本节最重要的内容是介绍Spring Security。如果你搞明白了什么场景需要选择他,那么你就掌握这节的重点内容。
请给文章点个赞,也给你自己点个赞。下一节,我们将聊聊关于授权和认证的相关概念.