SpringBoot开发——SpringSecurity安全框架17个业务场景案例(一)

文章目录

  • 一、Spring Security 常用应用场景介绍
  • 二、Spring Security场景案例
    • 1、认证(Authentication)
      • 1.1. Spring Security 配置
      • 1.2 业务逻辑代码
      • 1.3 登录控制器
      • 1.4 登录页面 (login.html)
    • 2、授权(Authorization)
      • 2.1 Spring Security 配置
      • 2.2 业务逻辑代码
      • 2.3 控制器
    • 3、表单登录(Form-Based Login)
      • 3.1 Spring Security 配置
      • 3.2 登录控制器
      • 3.3 登录页面 (login.html)
      • 3.4 Home页面 (home.html)
      • 3.5 配置静态资源
    • 4、HTTP 基本认证(HTTP Basic Authentication)
      • 4.1 Spring Security 配置
      • 4.2 业务逻辑代码
      • 4.3测试HTTP基本认证
    • 5、OAuth2 和 OpenID Connect
      • 5.1 Spring Security 配置
      • 5.2 业务逻辑代码

Spring Security通过一系列注解简化了安全配置,我们将深入探讨Spring Security框架的17个关键应用场景,包括认证、授权、OAuth2CSRF保护等。每个案例都配有详细的时序图和代码示例,旨在帮助开发者全面理解并有效利用Spring Security的强大功能,以构建更安全、更可靠的应用程序。

一、Spring Security 常用应用场景介绍

1、认证(Authentication)

  • 应用场景:确保只有经过验证的用户才能访问应用程序。

2、授权(Authorization)

  • 应用场景:控制用户对特定资源的访问权限,如角色基础的访问控制。

3、表单登录(Form-Based Login)

  • 应用场景:为用户提供登录表单,处理登录请求和重定向。

4、HTTP 基本认证(HTTP Basic Authentication)

  • 应用场景:为 RESTful API 或其他服务提供基础的用户名和密码认证。

5、OAuth2 和 OpenID Connect

  • 应用场景:支持现代的授权框架,适用于需要第三方应用认证的场景。

6、CSRF 保护(CSRF Protection)

  • 应用场景:防止跨站请求伪造攻击,保护 Web 应用程序的安全。

7、密码编码(Password Encoding)

  • 应用场景:安全地存储用户密码,防止密码泄露。

8、方法级安全性(Method Security)

  • 应用场景:控制对特定方法或 Bean 属性的访问,实现细粒度的安全控制。

9、异常处理(Exception Handling)

  • 应用场景:自定义安全相关的异常处理,如认证失败、授权失败。

10、记住我(Remember-Me)

  • 应用场景:为用户提供持久的登录状态,方便用户再次访问。

11、预授权(Pre-Invocation)

  • 应用场景:在方法执行前进行安全检查,确保方法调用的安全性。

12、表达式支持(Expression-Based)

  • 应用场景:使用 Spring Expression Language (SpEL) 实现复杂的安全逻辑。

13、安全上下文(Security Context)

  • 应用场景:管理和检索认证信息,如获取当前认证用户。

14、安全过滤器链(Security Filter Chain)

  • 应用场景:处理 HTTP 请求的安全检查,如认证、授权。

15、用户详细信息服务(UserDetailsService)

  • 应用场景:自定义用户认证信息的加载逻辑,如从数据库加载用户数据。

16、多因素认证(Multi-Factor Authentication)

  • 应用场景:增加额外的安全层,如短信验证码、电子邮件确认。

17、匿名访问(Anonymous Access)

  • 应用场景:允许未认证的用户访问某些公共资源。

二、Spring Security场景案例

1、认证(Authentication)

业务场景: 一个在线书店系统,用户需要登录后才能查看订单和购买书籍。
业务时序图
在这里插入图片描述
1.用户(User) 访问登录页面。

2.表单登录认证过滤器(FormLoginAuthenticationFilter) 显示登录表单。

3.用户填写凭据并提交。

4.表单登录认证过滤器(FormLoginAuthenticationFilter) 调用 认证管理器(AuthenticationManager) 的 attemptAuthentication 方法。

5.认证管理器(AuthenticationManager) 请求 用户详细信息服务(UserDetailsService) 根据用户名加载用户信息。

6.用户详细信息服务(UserDetailsService) 调用自定义的 CustomUserDetailsService 获取用户详细信息。

7.CustomUserDetailsService 返回用户详细信息给 认证管理器(AuthenticationManager) 。

8.认证管理器(AuthenticationManager) 请求 密码编码器(PasswordEncoder) 对用户输入的密码进行编码。

9.密码编码器(PasswordEncoder) 将编码后的密码与存储的密码进行比较。

10.认证管理器(AuthenticationManager) 根据比较结果决定认证是否成功。

11.表单登录认证过滤器(FormLoginAuthenticationFilter) 根据认证结果重定向用户到主页或显示错误。

12.认证信息被设置到 SecurityContextHolder 中。

1.1. Spring Security 配置

首先,我们需要配置Spring Security来处理用户的登录请求。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
   
  @Override
  protected void configure(HttpSecurity http) throws Exception {
   
        http       
			.authorizeRequests()           
				.antMatchers("/login", "/register").permitAll()
                .anyRequest().authenticated()
			.and()
            .formLogin()
				.loginPage("/login")               
				.defaultSuccessUrl("/home", true)                
				.permitAll()            
			.and()            
			.logout()               
				.permitAll();    
	}

	@Override    
	protected void configure(AuthenticationManagerBuilder auth) throws Exception{
   
        auth           
			.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
         .and()
         .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
  }
 
	@Bean    
	public PasswordEncoder passwordEncoder() {
   
    	return new BCryptPasswordEncoder();
    }
}

1.2 业务逻辑代码

接下来,我们创建一个服务来处理用户的登录逻辑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

@Service
public class AuthService {
   

    @Autowired    
	private AuthenticationManager authenticationManager;

   /**
     * 用户登录方法
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录成功返回 true,否则返回 false
     */

    public boolean authenticateUser(String username, String password) {
   

       try {
   
            // 调用 Spring Security 的认证管理器进行认证
            Authentication authentication = authenticationManager
                .authenticate(new UsernamePasswordAuthenticationToken(username,password));

            // 将认证信息放入安全上下文中
            authenticationManager.authenticate(authentication);

            // 认证成功
            return true;
        } catch (Exception e) {
   
            // 认证失败
            return false;
        }
    }
}

1.3 登录控制器

最后,我们需要一个控制器来处理用户的登录请求。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LoginController {
   

    @GetMapping("/login")
    public String login() {
   
        return "login";
    }

   @GetMapping("/home")
    public String home()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjzhang75

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值