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

举报
bug菌 发表于 2025/01/24 11:53:22 2025/01/24
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏,手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!@TOC环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 📝 前言:让安全不再复杂在开发 Web 应用时,安全性是一个至关重要的环节...

🏆本文收录于「滚雪球学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 中实现用户认证与授权,让你的应用更加安全。


📌 目录:

  1. 认证与授权的基本概念 🧠
  2. Spring Security:让认证与授权更简单 🔒
  3. 在 Spring Boot 中配置 Spring Security ⚙️
  4. 自定义认证流程 🛠
    • 使用数据库进行用户认证
    • 使用 JWT(JSON Web Token)进行认证
  5. 授权配置:角色与权限 👥
    • 基于角色的授权
    • 基于权限的授权
  6. 案例实践:实现一个简单的用户认证与授权系统 📝
  7. 总结与拓展 📚

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

这样,你就可以使用 adminadmin123 来登录应用了。


4. 自定义认证流程 🛠

Spring Security 提供了很多方式来定制认证流程。我们来看两个常见的场景:使用数据库进行用户认证使用 JWT 进行认证

4.1 使用数据库进行用户认证

假设你希望通过数据库中的用户信息来进行认证。你需要做的就是通过 Spring Security 的 JdbcUserDetailsManager 来实现自定义认证。

  1. 配置数据源:

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
  1. 创建自定义的 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<>())
        );
    }
}
  1. 配置 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)是一种非常流行的认证方式,它允许服务器生成一个签名令牌,客户端保存该令牌并在每次请求时发送给服务器进行验证。

  1. 生成 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();
    }
}
  1. 配置过滤器:

在 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);
    }
}
  1. 配置 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 应用实现认证与授权。我们可以构建一个简单的系统,在其中实现基于数据库的用户认证与基于角色的授权控制。

  1. 数据库配置:如前文所述,通过配置数据库中的用户信息进行认证。
  2. 角色授权:限制不同的 URL 访问权限。
  3. 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-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。