SpringBoot使用Sa-Token实现路径拦截和特定接口放行
1. 引入依赖
首先,在pom.xml
文件中引入Sa-Token相关的依赖。Sa-Token是一个轻量级的Java权限认证框架,可以帮助我们轻松实现用户登录状态的管理和权限认证。
<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.27.0</version> </dependency>
2. 创建配置类 SecurityProperties
定义一个配置类SecurityProperties
,用于读取和存储从配置文件中加载的排除路径信息。这里使用了Spring Boot的@ConfigurationProperties
注解来绑定配置文件中的属性。
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import lombok.Data; @Data @Component @ConfigurationProperties(prefix = "security") public class SecurityProperties { /** * 排除路径 */ private String[] excludes; }
@Data
:这是Lombok的注解,自动生成getter和setter方法。@Component
:将该类注册为Spring的组件。@ConfigurationProperties
:指定前缀security
,从配置文件中读取以该前缀开头的属性,并将这些属性映射到该类的字段上。
3. 编写配置文件
在配置文件application.yml
或者application.properties
中,配置需要排除的路径。例如:
application.yml:
security: excludes: - "/public/**" - "/login" - "/register"
application.properties:
security.excludes=/public/**,/login,/register
/public/**
:排除所有以/public/
开头的路径。/login
:排除/login
路径。/register
:排除/register
路径。
4. 配置拦截器
创建一个配置类WebConfig
,实现WebMvcConfigurer
接口,在其中配置Sa-Token的拦截器,并将排除的路径应用到拦截器中。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpUtil; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private SecurityProperties securityProperties; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaInterceptor(handler -> { // 获取所有的URL并进行检查 SaRouter.match("/**").check(() -> { // 检查是否登录 StpUtil.checkLogin(); }); })) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns(securityProperties.getExcludes()); // 排除指定路径 } }
@Configuration
:标识这是一个配置类。addInterceptors
:重写该方法,向Spring的拦截器注册中心添加自定义的拦截器。SaInterceptor
:Sa-Token提供的拦截器,主要用于权限验证。SaRouter.match("/**")
:匹配所有路径。StpUtil.checkLogin()
:Sa-Token提供的登录状态检查方法,用于验证用户是否已登录。excludePathPatterns
:从拦截中排除指定的路径,这些路径从SecurityProperties
中获取。
5. 验证拦截效果
启动Spring Boot应用程序,验证配置是否生效。以下是一些测试步骤:
访问排除路径:
- 尝试访问配置文件中排除的路径,如
/public/**
、/login
、/register
。 - 这些路径应不会触发登录检查,可以直接访问。
- 尝试访问配置文件中排除的路径,如
访问其他路径:
- 尝试访问其他未排除的路径,如
/admin
、/user/profile
等。 - 这些路径应触发Sa-Token的登录验证逻辑,如果用户未登录,将会被拦截,并返回相应的未登录提示。
- 尝试访问其他未排除的路径,如
代码解析
SecurityProperties
类:通过@ConfigurationProperties
注解,Spring Boot会自动将前缀为security
的配置属性绑定到该类的excludes
字段上,从而实现排除路径的配置。- 配置文件:在配置文件中定义需要排除的路径,以便动态加载到
SecurityProperties
中。 WebConfig
类:实现WebMvcConfigurer
接口,通过addInterceptors
方法添加Sa-Token的拦截器,并使用excludePathPatterns
方法将配置文件中定义的排除路径应用到拦截器中。
详细解释
依赖配置
Sa-Token是一个轻量级的权限认证框架,可以帮助我们轻松实现用户登录状态的管理和权限认证。通过引入sa-token-spring-boot-starter
依赖,我们可以很方便地将其集成到Spring Boot项目中。
配置类 SecurityProperties
SecurityProperties
类的作用是将配置文件中定义的排除路径读取并存储到excludes
数组中。通过使用@ConfigurationProperties
注解,我们可以将前缀为security
的属性绑定到该类的excludes
字段上。这样做的好处是,排除路径可以通过配置文件进行动态配置,方便管理和维护。
配置文件
在配置文件中,我们定义了需要排除的路径。这些路径将不会被拦截器拦截,可以直接访问。配置文件支持YAML格式和Properties格式,根据项目需要选择合适的格式进行配置。
拦截器配置
在WebConfig
类中,我们实现了WebMvcConfigurer
接口,并重写了addInterceptors
方法。在该方法中,我们创建了一个Sa-Token的拦截器,并通过SaRouter.match("/**")
匹配所有路径。对于匹配到的路径,我们使用StpUtil.checkLogin()
方法进行登录状态检查。如果用户未登录,将会被拦截,并返回相应的未登录提示。
通过excludePathPatterns
方法,我们将从SecurityProperties
中获取的排除路径应用到拦截器中。这样一来,配置文件中定义的排除路径将不会被拦截器拦截,可以直接访问。
总结
通过本文的介绍,我们了解了如何在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行。我们首先引入了Sa-Token的依赖,然后定义了一个配置类SecurityProperties
,用于读取和存储排除路径信息。接着,在配置文件中定义了需要排除的路径,并在WebConfig
类中配置了Sa-Token的拦截器,将排除路径应用到拦截器中。最后,通过测试和验证,确保配置生效,实现了对特定路径的放行和其他路径的权限验证。
这种方式可以帮助开发者更灵活地管理Web应用中的访问控制,提升系统的安全性和可维护性。如果你有更多的自定义需求,可以根据Sa-Token的文档进行进一步配置和扩展。
以上就是SpringBoot使用Sa-Token实现路径拦截和特定接口放行的详细内容,更多关于SpringBoot Sa-Token拦截和放行的资料请关注脚本之家其它相关文章!
相关文章
详解Java删除Map中元素java.util.ConcurrentModificationException”异常解决
这篇文章主要介绍了详解Java删除Map中元素java.util.ConcurrentModificationException”异常解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01
最新评论