大白话解释安全框架Spring Security是什么 有什么用 怎么用
Spring Security是什么?
Spring Security就像你公司的“门禁系统”,专门管两件事——
你是谁(认证):每个员工进公司都要刷卡或刷脸,确认身份合法才能进。
你能去哪(授权):普通员工只能进办公区,领导能进财务室,保洁阿姨能进仓库——不同权限的人能去的地方不一样。
**技术解释:它是Spring官方推出的安全框架,前身叫Acegi Security,专门解决Java程序的身份验证(登录)、权限控制(谁能访问什么)、防攻击(防黑客)**等问题,相当于给程序加了一套“防盗门”。
二、Spring Security有什么用?
核心功能
**登录认证:**支持用户名密码、指纹、扫码、第三方登录(微信/钉钉)等方式,比如用户输错密码3次就锁账号。
**权限管理:**控制不同用户能访问的页面或功能,比如普通用户只能看商品,管理员能删改商品 。
**防攻击:**自动防CSRF(伪造请求)、XSS(脚本攻击)、暴力破解等,像门禁系统能识别假门卡。
实际场景
电商:用户登录后只能看自己的订单,管理员能看所有订单。
银行系统:操作转账必须二次验证(短信验证码)。
企业内部系统:不同部门员工只能访问自己部门的文件。
Spring Security怎么用?三步走:装门禁→定规则→发门卡
安装(装门禁)
添加依赖(类似买门禁设备):
在项目的pom.xml里加一行代码,引入Spring Security包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
加完依赖后,所有接口默认需要登录才能访问,账号是user,密码在控制台随机生成。
配置规则(定权限)
创建配置类(定门禁规则)
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/home").permitAll() // 首页所有人能看
.antMatchers("/admin/**").hasRole("ADMIN") // 管理员才能进后台
.anyRequest().authenticated() // 其他页面需登录
.and()
.formLogin() // 开启登录页
.loginPage("/login") // 自定义登录页地址
.defaultSuccessUrl("/dashboard") // 登录后跳转
.and()
.logout().permitAll(); // 允许退出登录
}
}
这段代码相当于规定:谁都能进/home页面;
只有管理员能进/admin开头的页面;
其他页面必须登录才能看 。
发门卡(用户权限)
内存用户(临时测试用):
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("张三").password("{noop}123").roles("USER")
.and()
.withUser("李四").password("{noop}admin").roles("ADMIN");
}
这段代码创建两个用户:张三(密码123,普通用户);李四(密码admin,管理员)。
数据库用户(正式用):
实现UserDetailsService接口,从数据库查用户信息,比如:
@Service
public class MyUserService implements UserDetailsService {
@Autowired
private UserRepository userRepo; // 假设用户存在数据库里
@Override
public UserDetails loadUserByUsername(String username) {
User user = userRepo.findByUsername(username);
return new org.springframework.security.core.userdetails.User(
user.getUsername(),
user.getPassword(),
user.getRoles() // 角色列表(如ROLE_ADMIN)
);
}
}
注意事项
**别关CSRF防护:**默认开启的CSRF防护能防伪造请求攻击,除非你明确知道自己在做什么。
**密码必须加密:**别用明文存密码,推荐用BCryptPasswordEncoder加密(比如{bcrypt}$2a
10
10
10…)。
**权限分配最小化:**普通用户尽量少给权限,避免被黑客利用后造成更大损失。
适用场景:所有需要登录和权限控制的系统,比如电商、银行、OA系统。