<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 Spring Boot 里头的安全性。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。
二、安全性是啥玩意儿?
安全性是系统开发里头的一个核心问题,说白了就是保证系统的数据和操作不被非法访问。Spring Boot 里头默认就集成了安全性,用起来贼方便。
1. 认证与授权
安全性里头有两个核心概念:认证(Authentication)和授权(Authorization)。
- 认证:就是验证用户的身份,比如说用户名和密码。
- 授权:就是验证用户的权限,比如说某个用户能不能访问某个资源。
2. Spring Security 是啥玩意儿?
Spring Security 是 Spring 里头的一个安全性框架,专门用来实现认证和授权。Spring Boot 里头默认就集成了 Spring Security,用起来贼方便。
三、Spring Boot 集成 Spring Security
Spring Boot 里头集成 Spring Security 很简单,只要加个依赖,配个安全性配置就行了。
1. 添加依赖
首先,你得在 pom.xml 里头加个 Spring Security 的依赖。
XML Code |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> |
这段代码里头,spring-boot-starter-security 是 Spring Boot 里头的 Spring Security 依赖。
2. 配置安全性
然后,你得在 application.properties 里头配个安全性配置。
Properties Code |
spring.security.user.name=admin spring.security.user.password=admin |
这段代码里头,spring.security.user.name 是默认的用户名,spring.security.user.password 是默认的密码。
3. 使用 Spring Security
最后,你可以在代码里头用 Spring Security 来实现认证和授权。
Java Code |
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin(); } } |
这段代码里头,SecurityConfig 类继承了 WebSecurityConfigurerAdapter,重写了 configure 方法,配置了安全性。
四、Spring Boot 使用 JWT 实现认证
JWT(JSON Web Token)是一种开放标准(RFC 7519),用来在各方之间安全地传输信息。Spring Boot 里头使用 JWT 实现认证很简单,只要加个依赖,配个 JWT 配置就行了。
1. 添加依赖
首先,你得在 pom.xml 里头加个 JWT 的依赖。
Java Code |
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> |
这段代码里头,jjwt 是 JWT 的依赖。
2. 配置 JWT
然后,你得在 application.properties 里头配个 JWT 配置。
Properties Code |
jwt.secret=mySecret jwt.expiration=86400 |
这段代码里头,jwt.secret 是 JWT 的密钥,jwt.expiration 是 JWT 的过期时间。
3. 生成 JWT
最后,你可以在代码里头生成 JWT。
Java Code |
@Service public class JwtService { @Value("${jwt.secret}") private String secret; @Value("${jwt.expiration}") private long expiration; public String generateToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } } |
这段代码里头,generateToken 方法用 Jwts.builder 生成了一个 JWT。
五、Spring Boot 使用 JWT 实现授权
Spring Boot 里头使用 JWT 实现授权很简单,只要加个过滤器,配个授权配置就行了。
1. 添加过滤器
首先,你得在代码里头加个 JWT 过滤器。
Java Code |
@Component public class JwtFilter extends OncePerRequestFilter { @Autowired private JwtService jwtService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = request.getHeader("Authorization"); if (token != null && jwtService.validateToken(token)) { String username = jwtService.getUsernameFromToken(token); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); SecurityContextHolder.getContext().setAuthentication(authentication); } filterChain.doFilter(request, response); } } |
这段代码里头,JwtFilter 类继承了 OncePerRequestFilter,重写了 doFilterInternal 方法,实现了 JWT 过滤器。
2. 配置授权
然后,你得在 SecurityConfig 里头配个授权配置。
Java Code |
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtFilter jwtFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } } |
这段代码里头,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) 表示在 UsernamePasswordAuthenticationFilter 之前添加 JwtFilter。
六、Spring Boot 使用 Spring Security 的坑点
1. 安全性配置不对
Spring Boot 里头,安全性配置不对,那认证和授权就不起作用了。你要是没配好,那可得好好检查检查。
Java Code |
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin(); } } |
这段代码里头,antMatchers("/public/**").permitAll() 表示 /public/** 路径下的资源不需要认证。
2. JWT 配置不对
Spring Boot 里头,JWT 配置不对,那认证和授权就不起作用了。你要是没配好,那可得好好检查检查。
Properties Code |
jwt.secret=mySecret jwt.expiration=86400 |
这段代码里头,jwt.secret 和 jwt.expiration 是 JWT 的配置。
3. 过滤器顺序不对
Spring Boot 里头,过滤器顺序不对,那认证和授权就不起作用了。你要是没配好,那可得好好调整调整。
Java Code |
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtFilter jwtFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } } |
这段代码里头,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) 表示在 UsernamePasswordAuthenticationFilter 之前添加 JwtFilter。
专有名词解释
- 安全性:系统开发里头的一个核心问题,保证系统的数据和操作不被非法访问。
- 认证:验证用户的身份,比如说用户名和密码。
- 授权:验证用户的权限,比如说某个用户能不能访问某个资源。
- Spring Security:Spring 里头的一个安全性框架,专门用来实现认证和授权。
- JWT:JSON Web Token,一种开放标准,用来在各方之间安全地传输信息。
- Jwts.builder:JWT 的一个类,用来生成 JWT。
- OncePerRequestFilter:Spring 里头的一个类,用来实现过滤器。
- UsernamePasswordAuthenticationToken:Spring Security 里头的一个类,用来表示用户名和密码的认证信息。
- SecurityContextHolder:Spring Security 里头的一个类,用来保存安全性上下文。
- addFilterBefore:Spring Security 里头的一个方法,用来添加过滤器。
=======================================================================
写在最后
身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...
我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。
当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。
另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。
最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!