Spring Boot的安全性:保护应用程序免受攻击

举报
bug菌 发表于 2025/05/30 17:53:53 2025/05/30
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🌱 前言 🔐

  安全性是任何Web应用的核心要求之一,Spring Boot与Spring Security的集成使得安全管理变得更简单、灵活。Spring Security是Spring官方提供的一个强大框架,它为应用程序提供了身份验证、授权、攻击防护等安全功能。

  本文将介绍如何在Spring Boot应用中集成Spring Security进行身份验证与授权,如何使用基本认证(Basic Authentication)和JWT认证,并如何配置权限控制。


💡 集成Spring Security进行身份验证和授权

1. Spring Security简介

Spring Security是一个高度可定制的身份验证和访问控制框架。它能够为应用程序提供以下功能:

  • 身份验证:确认用户的身份,确保用户是他所声称的那个人。
  • 授权:授予或拒绝用户访问特定资源的权限。
  • 防护:防止常见的安全攻击,如CSRF、Session fixation等。

2. 集成Spring Security

在Spring Boot项目中,集成Spring Security非常简单。首先,您需要在pom.xml中加入Spring Security的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

添加该依赖后,Spring Boot会自动启用Spring Security的默认配置。默认情况下,Spring Security会启用基本身份验证(Basic Authentication),并为所有HTTP请求提供一个简单的身份验证机制。


🔑 基本认证与JWT认证

1. 基本认证(Basic Authentication)

基本认证是最简单的一种身份验证机制,客户端将用户名和密码编码为Base64,并在HTTP请求头中携带。Spring Security会解码这些凭证并进行验证。

1.1 配置基本认证

Spring Security会自动启用基本认证。默认情况下,它会使用内存中存储的用户数据进行身份验证,你可以通过配置文件来修改这些默认设置。

例如,使用内存中的用户身份验证:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在这个配置中,我们使用inMemoryAuthentication来创建两个用户:“user”和“admin”。Spring Security将会使用用户名和密码验证用户身份。

1.2 访问保护的资源

默认情况下,Spring Security会要求所有请求都进行身份验证。你可以通过以下配置来限制资源的访问:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .anyRequest().authenticated()
        .and()
        .httpBasic(); // 启用基本认证
}

这个配置确保只有角色为ADMIN的用户可以访问/admin/**路径,只有角色为USER的用户可以访问/user/**路径。

2. JWT认证(JSON Web Token)

JWT(JSON Web Token)是一种更为现代的认证方式。JWT通过将用户的身份和权限信息加密成Token,并将Token传递给客户端,客户端每次请求时将该Token添加到HTTP请求头中进行身份验证。

2.1 配置JWT认证

JWT认证涉及以下几个步骤:

  1. 用户使用用户名和密码登录,后端生成JWT Token。
  2. 客户端使用JWT Token进行后续请求。
  3. 后端验证Token的有效性,并根据Token中的信息进行授权。

2.2 生成JWT Token

首先,我们需要创建一个工具类来生成JWT Token:

public class JwtTokenUtil {

    private String secretKey = "your-secret-key"; // 密钥
    private long expiration = 86400; // Token过期时间,单位为秒

    // 生成Token
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
                .signWith(SignatureAlgorithm.HS512, secretKey)
                .compact();
    }

    // 获取Token中的用户名
    public String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    // 验证Token是否有效
    public boolean isTokenExpired(String token) {
        return getExpirationDateFromToken(token).before(new Date());
    }

    private Date getExpirationDateFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
    }

    // 验证Token
    public boolean validateToken(String token, String username) {
        String tokenUsername = getUsernameFromToken(token);
        return (username.equals(tokenUsername) && !isTokenExpired(token));
    }
}

2.3 过滤JWT Token

然后,我们需要创建一个JWT过滤器,拦截所有的HTTP请求并验证Token的有效性:

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private JwtTokenUtil jwtTokenUtil;

    public JwtAuthenticationFilter(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            String username = jwtTokenUtil.getUsernameFromToken(token);

            if (username != null && jwtTokenUtil.validateToken(token, username)) {
                Authentication authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        filterChain.doFilter(request, response);
    }
}

2.4 配置JWT认证

最后,在Spring Security配置中添加JWT认证过滤器:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private JwtTokenUtil jwtTokenUtil;

    public SecurityConfig(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .addFilterBefore(new JwtAuthenticationFilter(jwtTokenUtil), UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated();
    }
}

在这个配置中,我们通过addFilterBefore将JWT认证过滤器添加到Spring Security的过滤链中。


🛡️ Spring Security的权限控制

1. 权限控制配置

Spring Security通过权限控制机制(基于角色或基于权限)来管理用户对资源的访问权限。你可以使用@PreAuthorize@Secured等注解来进行细粒度的权限控制。

1.1 基于角色的访问控制

在配置中,你可以指定哪些角色有权访问特定的URL或资源:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .anyRequest().authenticated();
}

1.2 基于方法的访问控制

Spring Security还支持基于方法的访问控制,通过@PreAuthorize等注解,可以在方法级别进行权限控制:

@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) {
    userRepository.deleteById(userId);
}

🎯 总结:Spring Boot的安全性管理

通过集成Spring Security,Spring Boot能够为应用程序提供强大的安全功能,包括身份验证、授权、攻击防护等。通过基本认证和JWT认证,可以实现灵活的身份验证方案,而基于角色和方法的权限控制使得开发者能够精细化地管理访问权限。

核心功能:

  • 身份验证与授权:支持基本认证、JWT认证、基于角色和权限的访问控制。
  • 细粒度权限控制:支持基于方法的权限控制。
  • 攻击防护:自动防护常见的安全攻击(如CSRF、Session Fixation等)。

通过这些安全机制,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个月内不可修改。