Spring Security

什么是Spring Security

Spring Security 是基于Spring AOP和Servlet过滤器的安全框架,它提供全面的安全解决方案,同时在Web请求级别和方法调用级别处理身份确认和授权

Spring Security 核心功能

1、认证(你是谁,用户/设备/系统)

2、验证(你能干什么,也叫权限控制/授权,允许执行的操作)

3、攻击防护(防止伪造身份)

Spring Security原理技术

Filter、Servlet、Spring DI、Spring AOP

常用的安全框架

目前常用的安全框架主要是Spring Security 和Apache Shiro

相同点
1、认证功能
2、授权功能
3、会话功能
4、加密功能
5、缓存支持
6、remeberMe功能

不同点
优点
1、Spring Security基于Spring开发,项目中如果使用Spring 作为基础,配合Spring Security做权限更加方便。而Shiro需要和Spring进行整合

2、Spring Securiy功能闭Shiro更加丰富,例安全防护方面

3、Spring Security 社区资源相比Shiro更加丰富

4、如何使用SpringBoot、SpringCloud的话,三者无缝对接

缺点

1、Shiro的配置和使用比较简单,Spring Security 上手更复杂写

2、Shiro依赖性低,不需要任何框架和容器,可以独立运行,而Spring Security依赖Spring 容器

编码思路

我们要在内存中初始化我们的认证信息的话,那么需要重写WebSecurityConfigurationAdapter类中的configure方法:

configue(AuthenticationManagerBuilder auth)然后通过auth对象的inMemoryAuthentication()方法指定认证信息:
auth.inMemoryAuthentication().withUser(“admin”).password(“123456”)

密码加密

protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        /**
         * 基于内存的方式,构建两个用户账号:admin/admin,user/user
         */
        auth.inMemoryAuthentication().
                passwordEncoder(new BCryptPasswordEncoder()).
                withUser("admin").
                password(new BCryptPasswordEncoder().encode("admin")).
                roles();
        
        auth.inMemoryAuthentication().
                passwordEncoder(new BCryptPasswordEncoder()).
                withUser("user").
                password(new BCryptPasswordEncoder().encode("user")).
                roles();
    }

如何给指定的用户指定角色
在这里插入图片描述
如何开启方法级别的安全控制

在这里插入图片描述

如何配置方法级别的权限控制

使用注解@PreAuthorize("hasAnyRole(‘admin’))即可指定访问级别的角色
持续更新

Spring SecuritySpring 生态系统中的核心组件,也是一个功能强大且高度可定制的身份验证和访问控制框架,是保护基于 Spring 的应用程序的事实上的标准,致力于为 Java 应用程序提供身份验证和授权,通过提供认证(Authentication)与授权(Authorization)和针对常见攻击等一系列安全功能,为开发者构建安全稳定的应用提供强有力的支持,且可轻松扩展以满足自定义需求 [^1][^2]。 ### 使用指南 Spring Security 会对 `/login` 的 POST 请求做拦截,校验表单中用户名和密码,这一功能由 `UsernamePasswordAuthenticationFilter` 实现 [^3]。在实际使用时,通常要创建一个配置类来定制 Spring Security 的行为。以下是一个简单示例: ```java 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.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); return http.build(); } } ``` 上述代码配置了所有请求都需要认证,支持表单登录和 HTTP 基本认证。 ### 配置方法 Spring Security 的配置主要通过 Java 配置类和注解来完成。 - **Java 配置类**:继承 `WebSecurityConfigurerAdapter`(Spring Boot 2.7.x 之前)或者使用 `SecurityFilterChain` Bean(Spring Boot 2.7.x 及之后)来配置安全策略。 ```java 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.web.SecurityFilterChain; @Configuration public class CustomSecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); return http.build(); } } ``` 以上代码配置了 `/public` 路径下的请求无需认证,其他请求需要认证,自定义了登录页面,并允许注销操作。 - **注解**:使用 `@EnableWebSecurity` 启用 Spring Security 的 Web 安全支持。 ### 最佳实践 - **使用 HTTPS**:在生产环境中,使用 HTTPS 来加密数据传输,防止数据被窃取和篡改。 - **密码加密**:在存储用户密码时,使用安全的加密算法,如 BCrypt。 ```java import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; public class PasswordEncoderExample { public static void main(String[] args) { PasswordEncoder encoder = new BCryptPasswordEncoder(); String encodedPassword = encoder.encode("password123"); System.out.println(encodedPassword); } } ``` - **细粒度的访问控制**:根据用户角色和权限,对不同的资源和 URL 进行细粒度的访问控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值