当前位置: 首页 > news >正文

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的安全性:使用 Spring Security 实现认证与授权

  <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 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。

专有名词解释

  1. 安全性:系统开发里头的一个核心问题,保证系统的数据和操作不被非法访问。
  2. 认证:验证用户的身份,比如说用户名和密码。
  3. 授权:验证用户的权限,比如说某个用户能不能访问某个资源。
  4. Spring Security:Spring 里头的一个安全性框架,专门用来实现认证和授权。
  5. JWT:JSON Web Token,一种开放标准,用来在各方之间安全地传输信息。
  6. Jwts.builder:JWT 的一个类,用来生成 JWT。
  7. OncePerRequestFilter:Spring 里头的一个类,用来实现过滤器。
  8. UsernamePasswordAuthenticationToken:Spring Security 里头的一个类,用来表示用户名和密码的认证信息。
  9. SecurityContextHolder:Spring Security 里头的一个类,用来保存安全性上下文。
  10. addFilterBefore:Spring Security 里头的一个方法,用来添加过滤器。

=======================================================================

写在最后

身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...

我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。

当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。

另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!

相关文章:

  • React 中的 Props
  • 文件操作与IO—文件读写
  • 开源手机号码价值评估系统
  • AI Agent系列(八) -基于ReAct架构的前端开发助手(DeepSeek)
  • Spring笔记04-注解注入
  • Python每日一题(11)
  • oracle执行计划
  • 《异常检测——从经典算法到深度学习》30. 在线服务系统中重复故障的可操作和可解释的故障定位
  • 42. 接雨水
  • Flutter敏感词过滤实战:基于AC自动机的高效解决方案
  • 二分查找:原理、循环不变量与边界处理
  • 设置网站主题色color-scheme
  • 【Easylive】HttpServletRequest、HttpServletResponse、HttpSession 介绍
  • Leetcode hot 100刷题之路(day 1)
  • 黑盒测试的场景法(能对项目业务进行设计测试点)
  • ngx_monotonic_time
  • Git Fetch 和 Git Pull 的区别
  • 双层板模组天线设计指南,50欧姆阻抗匹配设计
  • B-tree 索引失效 避坑指南
  • x265不同preset级别控制的编码参数与编码性能影响
  • 东莞网站平台价格/宣传推广方案范文
  • 建wap网站/百度收录提交申请网站
  • 成都推广网站多少钱/seo工作内容和薪资
  • 小型企业网站开发价格/百度手机助手app下载官网
  • 视频网站做推广有没有效果/深圳市社会组织总会
  • 怎样做自己的网站和发布网站/免费seo课程