Spring Boot 中的认证与授权——保护你的应用安全!

🏆本文收录于「滚雪球学SpringBoot」专栏,手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
@TOC
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
📝 前言:让安全不再复杂
在开发 Web 应用时,安全性是一个至关重要的环节。无论你是在开发个人博客还是企业级应用,都必须确保只有经过授权的用户才能访问敏感数据和功能。认证与授权是 Web 安全的两大核心组成部分,它们确保只有合法用户才能访问你的应用。
Spring Boot 提供了非常强大且灵活的安全框架——Spring Security,让你能够轻松地为应用添加认证与授权功能。在本篇文章中,我们将一起探索如何在 Spring Boot 中实现用户认证与授权,让你的应用更加安全。
📌 目录:
- 认证与授权的基本概念 🧠
- Spring Security:让认证与授权更简单 🔒
- 在 Spring Boot 中配置 Spring Security ⚙️
- 自定义认证流程 🛠
- 使用数据库进行用户认证
- 使用 JWT(JSON Web Token)进行认证
- 授权配置:角色与权限 👥
- 基于角色的授权
- 基于权限的授权
- 案例实践:实现一个简单的用户认证与授权系统 📝
- 总结与拓展 📚
1. 认证与授权的基本概念 🧠
认证(Authentication)
认证是用户验证其身份的过程。简单来说,用户需要提供自己的凭证(如用户名与密码),系统验证其是否为合法用户。如果认证成功,系统允许用户进入应用。
授权(Authorization)
授权是在认证通过之后,系统判断该用户是否有权限访问某些资源或执行某些操作的过程。授权通常基于角色或权限来管理。
举个例子,假如你是一个在线商城的开发者,认证是用户登录时验证用户名和密码是否正确;而授权则是系统根据用户的角色(例如普通用户或管理员)来决定是否允许他们访问管理后台。
2. Spring Security:让认证与授权更简单 🔒
Spring Security 是一个为 Java 应用提供认证与授权的框架,它是 Spring 生态系统的一部分,能够与 Spring Boot 无缝集成。Spring Security 提供了非常丰富的功能,包括:
- 认证:支持多种认证方式,如基于表单的认证、HTTP 基本认证、LDAP 认证等。
- 授权:支持基于角色、权限的访问控制。
- 防止 CSRF 攻击:自动保护你的应用免受跨站请求伪造攻击。
- 会话管理:可以配置会话的并发限制与超时设置。
Spring Security 的默认配置已经非常强大,适用于大多数常见场景,但你也可以根据需求进行自定义。
3. 在 Spring Boot 中配置 Spring Security ⚙️
在 Spring Boot 中,集成 Spring Security 非常简单。只需要添加相关的依赖,它就会自动启用基本的认证和授权功能。
3.1 添加依赖
在 pom.xml
中添加 Spring Security 相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
这将为你的应用引入 Spring Security 的所有功能。
3.2 默认安全配置
一旦你添加了 Spring Security 依赖,默认情况下,它会自动启用一个基本的 HTTP 基本认证,并创建一个默认的用户 user
,其密码会在控制台中输出。你可以通过 Spring Boot 配置文件来自定义用户名和密码。
在 application.properties
中添加:
spring.security.user.name=admin
spring.security.user.password=admin123
这样,你就可以使用 admin
和 admin123
来登录应用了。
4. 自定义认证流程 🛠
Spring Security 提供了很多方式来定制认证流程。我们来看两个常见的场景:使用数据库进行用户认证 和 使用 JWT 进行认证。
4.1 使用数据库进行用户认证
假设你希望通过数据库中的用户信息来进行认证。你需要做的就是通过 Spring Security 的 JdbcUserDetailsManager
来实现自定义认证。
- 配置数据源:
在 application.properties
中配置数据库连接:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 创建自定义的 UserDetailsService:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private DataSource dataSource;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String query = "SELECT username, password, enabled FROM users WHERE username = ?";
return new JdbcDaoImpl().getJdbcTemplate().queryForObject(query, new Object[]{username}, (rs, rowNum) ->
new User(rs.getString("username"), rs.getString("password"), rs.getBoolean("enabled"), true, true, true, new ArrayList<>())
);
}
}
- 配置 Spring Security:
在你的安全配置类中,使用自定义的 UserDetailsService
:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
4.2 使用 JWT 进行认证
JSON Web Token(JWT)是一种非常流行的认证方式,它允许服务器生成一个签名令牌,客户端保存该令牌并在每次请求时发送给服务器进行验证。
- 生成 JWT 令牌:
public class JwtUtil {
private String secretKey = "mysecretkey";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
public String extractUsername(String token) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
- 配置过滤器:
在 Spring Security 中,你可以通过创建一个自定义过滤器来处理 JWT 认证。
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private JwtUtil jwtUtil = new JwtUtil();
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
String username = jwtUtil.extractUsername(token.substring(7));
if (username != null) {
// 设置用户认证信息
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()));
}
}
filterChain.doFilter(request, response);
}
}
- 配置 Spring Security:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest().authenticated();
}
}
5. 授权配置:角色与权限 👥
5.1 基于角色的授权
Spring Security 可以基于角色进行授权控制。你可以通过 @PreAuthorize
注解或在 HttpSecurity
中配置访问控制。
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated();
5.2 基于权限的授权
如果你希望对不同的权限进行授权,可以使用 @PreAuthorize
注解或 @Secured
注解来限制对方法的访问。
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
public void adminMethod() {
// 只有具有 'ROLE_ADMIN' 权限的用户才能访问
}
6. 案例实践:实现一个简单的用户认证与授权系统 📝
通过 Spring Security,你可以快速为你的 Spring Boot 应用实现认证与授权。我们可以构建一个简单的系统,在其中实现基于数据库的用户认证与基于角色的授权控制。
- 数据库配置:如前文所述,通过配置数据库中的用户信息进行认证。
- 角色授权:限制不同的 URL 访问权限。
- JWT 认证:为 RESTful API 配置基于 JWT 的认证流程。
7. 总结与拓展 📚
通过 Spring Security,你可以非常方便地为你的 Spring Boot 应用实现认证与授权。无论是使用数据库认证、JWT 认证,还是基于角色或权限的授权,Spring Security 都为你提供了强大的支持。
希望今天的内容能够帮助你深入了解 Spring Boot 中的认证与授权机制,提升应用的安全性!🚀
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)