【 <二> 丹方改良: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

    org.springframework.boot

    spring-boot-starter-security

这段代码里头,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

    io.jsonwebtoken

    jjwt

    0.9.1

这段代码里头,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小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

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

你可能感兴趣的:(spring,spring,boot,java,后端,logback,servlet)