• Spring Security概述快速入门


    前言

    在深入了解Spring Security的相关功能之后,一直陷入了深深的纠结之中:是一片长文搞定,还是再搞个专栏。
    终于,用上了AI后,不再纠结怎么排版内容了。自此,我也明白了,饭要一口一口吃。

    Spring Security概述

    官方概述

    Spring Security是一款提供认证、授权、以及针对常见(网络)攻击的防御的框架。它为保护命令式和反应式应用程序提供了一流的支持,是保护基于Spring的应用程序的事实标准。

    • 从官方的介绍,我们可以看到他就是为基于Spring的应用量身定制的。这也是为什么我们如果使用Spring MVC/Spring Boot继承Spring Security如此丝滑的原因。
    • 三个关键词:认证授权、以及针对常见(网络)攻击的防御

    记住着三个关键词,因为他直接代表着Spring Security提供的三大核心功能/特性。

    Why Spring Security

    Spring Security的特性

    Spring Security的三个关键词就是他的特性。

    1. Authentication-认证:Spring Security提供通用的登录认证功能,同时支持Servlet应用,也能支持WebFlux这种响应式应用。
    2. Authorization-授权:Spring Security为授权提供了全面的支持。同时支持基于Request的授权和基于方法的授权。
    3. Protection Against Exploits-防范漏洞:结合常见的防范手段,提供支持:
      • Cross Site Request Forgery:跨域请求伪造
      • Response Header:提供通用的响应头设置,为功能性、常见的网络安全响应头提供支持,同时设置默认的请求头。
      • Request Header: 通过请求头可将http请求强制使用https.

    要回答这个问题,就不得不对比一下另一款流行的安全框架:Shiro

    框架的使用层面

    Spring SecurityShiro
    集成难易度与Spring框架无缝集成,可以很方便地与其他Spring组件一起使用需要与Spring进行整合开发,但配置和使用都比较简单
    活跃度和资源庞大的社区资源和文档支持,有大量使用案例和文档可供参考活跃的社区,为开发者提供交流和帮助平台
    依赖性依赖于Spring容器不依赖于任何框架或容器,可以独立运行
    使用复杂度功能丰富,使用起来可能稍微复杂一些API设计简洁,易于理解和使用
    定制性支持自定义安全注解和编程式访问控制,可根据项目需求进行定制化开发提供简洁的API和高度灵活性,可根据项目需求进行定制化开发
    性能性能表现良好,具体性能因使用场景而异在缓存等方面可能具有更好的性能表现

    功能对比层面

    功能Spring SecurityShiro
    身份认证支持多种身份认证机制,包括基于表单、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哈。

        
            
            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
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    配置过滤器链条

    这里就直接拿过来了

    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
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    这样,我们就搭建好了第一个简单的Spring Security工程。
    在浏览器,输入:http://localhost:8080/login,就进入登录页面了。
    然后,输入我们配置的用户名:user,密码:password,点击登录就进入首页了。

    后记

    本节最重要的内容是介绍Spring Security。如果你搞明白了什么场景需要选择他,那么你就掌握这节的重点内容。
    请给文章点个赞,也给你自己点个赞。下一节,我们将聊聊关于授权和认证的相关概念.

  • 相关阅读:
    RabbitMQ一、RabbitMQ的介绍与安装(docker)
    blender boxCutter插件
    分布式ID生成方案总结整理
    Listen,Attend,and Spell(LAS)——李宏毅人类语言处理学习笔记3
    配置vue前端服务器及express服务器端的服务器同时运行——concurrently
    Corel VideoStudio 会声会影2024剪辑中间的视频怎么删 剪辑中音乐太长怎么办
    Kali Linux 2024.1
    LeetCode 185 部门工资前三高的所有员工
    springMVC 源码学习-请求映射原理
    100分钟带你玩转 Spring AOP,轻松吊打面试官
  • 原文地址:https://blog.csdn.net/Evan_L/article/details/136605426