基于spring security框架遇到的401认证错误的定位

6 篇文章 0 订阅
5 篇文章 0 订阅

一:问题描述

目前的系统是基于若依框架开发的一个系统,这个系统划分了两个应用,分别是用户端应用和管理端应用,都是有独立的前端页面和后端服务。用户端应用和管理端应用除了war包是独立的,war所依赖的其他jar包基本差不多。

目前存在的问题是,针对管理端war包暴露的接口通过postman测试始终是报如下错误:


{

    "msg": "请求访问:/system/user/test,认证失败,无法访问系统资源",

    "code": 401

}

但是用户端应用暴露的接口通过postman测试一直是ok的。真是非常奇怪的一件事情。

二:问题分析

  1. 首先是多次对证失败的接口进行postman执行测试,依然是不通过的
  2. 其次对该接口换种别的写法,也是认证不通过。
  3. 接下来换成别的接口进行测试,还是不通过。
  4. 于是分析,目前验证的方式始终是在本地Dev环境测试出现的问题,在管理台上接口确实正常可以访问的。所以甚是奇怪。
  5. 既然排除是代码的问题,而且又是不同环境结果不同,那么就开始思考那可能是环境配置的问题。
  6. 于是开始坚持项目工程的环境配置文件,发现如下情况:

\src\main\resources目录下有四个配置文件来区分不同环境

基础配置:application.yml

本地环境application-dev.yml

测试环境:application-sit.yml

生产环境:application-prod.yml

接下来发现application.yml配置了

# token配置
token:
  # 令牌自定义标识
  header: Authorization
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 30

接下来发现application-dev.yml没有配置token,application-sit.yml配置token了,但配置的secret与application.yml是不一样的。

看到这个问题突然想起来了问题的原因和自己验证的过程。原来在验证的过程中往Postman贴的token传每次都是从Sit环境的管理台拷贝过来的,但是本地启动的是Dev环境,造成了使用测试环境的token去dev环境取认证,由于token的secret不一致,明显是验证不通过的。

三:解决方案:

将application-dev.yml 与 application-sit.yml的token的秘钥 改成一致就可以了。

四:问题总结:

当初对不同的环境划分不同的配置文件,是另外一个同事做的,当时他是按照他之前项目的经验和习惯落实到我的这个系统上的。

当时我给他讲划分配置文件的原则是公共的配置放到application.yml中,不同环境的分别放到各自的配置中,保持每个配置项个数要一致。那个时候他给我讲,如果是application-dev.yml、application-sit.yml等配置与application.yml重复配置项,那么会自动覆盖掉的。

目前遇到的这个问题就是因为 application-sit.yml 配置了token项,但application-dev.yml没有配置,由于的token的secret的值不一致,引出了的问题。

所以在相关配置、功能设计上一定要做到职责独立、不重复以及清晰,不一定非得使用多么高级的功能。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security是一个基于Spring框架的安全框架,为Spring应用程序提供声明式的安全访问控制功能。它提供了一组可插拔的API,开发人员可以使用这些API来实现安全领域的各种功能,例如认证、授权和攻击防护。Spring Security还提供了许多预构建的过滤器来拦截对受限资源的请求,并且可以通过配置进行自定义。以下是Spring Security的一些功能: 1. 认证和授权 Spring Security提供了基于角色和细粒度的访问控制功能,可以轻松实现用户身份认证和授权的功能。 2. 基于过滤器的安全性 Spring Security通过一系列过滤器来拦截对受限资源的请求,并在请求之前进行安全检查。 3. 支持多种认证方式 Spring Security支持多种认证方式,例如基于表单的认证和基于HTTP基本认证。 4. CSRF保护 Spring Security提供了内置的CSRF保护,可以防止跨站点请求伪造攻击。 以下是一个简单的Spring Security配置,它允许任何已经通过身份验证的用户访问所有页面: ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user") .password("password") .roles("USER"); } } ``` 这个配置使用了Spring Security提供的默认登录页面和HTTP基本认证方式进行认证。在这个配置,任何已经通过身份验证的用户都可以访问所有的页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯癫的老码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值