Spring Cloud架构中采用Spring Security OAuth2作为权限控制,关于OAuth2详细介绍可以参考 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

项目中采用OAuth2四种模式中的两种,Password模式和Client模式, Password模式用于控制用户的登录,Client模式用于控制后端服务相互调用。

权限架构调整后在近期发现一些问题,由于网上资料不多,只能单步调试方式看源码 (其实带着问题看源码是最好的方式)。现在将问题和解决方案整理如下:

一、免登录接口校验token问题
问题:APP端反馈,一些免登录接口会校验token

   详细:经过测试发现,免登录接口 如果传了access_token会对token合法性就行校验,如果不传接口不会校验,这导致了免登录接口的过期token会报错排查:经过查看源码发现spring-security-oauth2的过滤器 OAuth2AuthenticationProcessingFilter 会对请求进行拦截,(具体源码就不截图了)

如果存在access_token 则会根据userInfoEndpointUrl去认证服务器上校验token信息,
如果不存在access_token 则会继续执行spring-security的拦截器FilterSecurityInterceptor。 FilterSecurityInterceptor对路径是否需要授权,已经授权是否通过做校验~  
解决: 可以采用过滤器在执行到核心过滤器OAuth2AuthenticationProcessingFilter ,将不需要授权的请求头中的access_token过滤掉。或者APP免登录接口不传token

              最终采用的是后者

二、Token失效返回的是状态401的错误
1、问题: APP端反馈,传递失效access_token,返回401状态,期望是200同时以错误码方式提示token失效。

  排查:经过单步调试分析源码发现,token失效后,认证服务器会抛出异常,同时响应给资源服务器,资源服务发现认证服务器的错误后会抛出InvalideException。抛出的异常会经过默认的DefaultWebResponseExceptionTranslator 处理然后 Reseponse给Client端。解决:通过上面的分析指导。最后的异常是在DefaultWebResponseExceptionTranslator 处理的,所以只需要

自定义实现类Implements WebResponseExceptionTranslator 接口处理异常装换逻辑,
使得自定义的类生效
 (1)自定义异常转换类

复制代码
1 @Slf4j
2 public class Auth2ResponseExceptionTranslator implements WebResponseExceptionTranslator {
3
4 @Override
5 public ResponseEntity translate(Exception e) {
6 log.error(“Auth2异常”, e);
7 Throwable throwable = e.getCause();
8 if (throwable instanceof InvalidTokenException) {
9 log.info(“token失效:{}”, throwable);
10 return new ResponseEntity(new Message<>(ServerConstant.INVALID_TOKEN.getMsg(), ServerConstant.INVALID_TOKEN.getCode()), HttpStatus.OK);
11 }
12 return new ResponseEntity(new Message(e.getMessage(), String.valueOf(HttpStatus.METHOD_NOT_ALLOWED.value())), HttpStatus.METHOD_NOT_ALLOWED);
13 }
14 }
复制代码
(2)资源服务器中使得自定义类生效

复制代码
1 @Configuration
2 @EnableResourceServer
3 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
4
5
6 @Override
7 public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
// 定义异常转换类生效
8 AuthenticationEntryPoint authenticationEntryPoint = new OAuth2AuthenticationEntryPoint();
9 ((OAuth2AuthenticationEntryPoint) authenticationEntryPoint).setExceptionTranslator(new Auth2ResponseExceptionTranslator());
10 resources.authenticationEntryPoint(authenticationEntryPoint);
11 }
12
13
14 @Override
15 public void configure(HttpSecurity http) throws Exception {
16 http
17 .csrf().disable()
18 .exceptionHandling()
// 定义的不存在access_token时候响应
19 .authenticationEntryPoint(new SecurityAuthenticationEntryPoint())
20 .and()
21 .authorizeRequests().antMatchers("//").permitAll()
22 .anyRequest().authenticated()
23 .and()
24 .httpBasic().disable();
25 }
复制代码

2、问题:测试发现授权接口,当请求参数中不存在access_token时发现接口返回错误信息:
{“timestamp”:1539337154336,“status”:401,“error”:“Unauthorized”,“message”:“No message available”,“path”:"/app/businessCode/list"}

  排查:经过前面的分析发现,上面提到Security的FilterSecurityInterceptor对OAuth2中返回的信息和本身配置校验后,抛出AccessDenyException。解决:经过上面的几个问题的处理,发现思路还是一样的,需要定义响应结果,即1、自定义响应处理逻辑SecurityAuthenticationEntryPoint 2、自定义处理逻辑SecurityAuthenticationEntryPoint生效(见上面的配置)SecurityAuthenticationEntryPoint具体实现:

复制代码
1 @Slf4j
2 public class SecurityAuthenticationEntryPoint implements AuthenticationEntryPoint {
3
4 @Override
5 public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
6 log.error(“Spring Securtiy异常”, authException);
7 response.setCharacterEncoding(“UTF-8”);
8 response.setContentType(“application/json; charset=utf-8”);
9 PrintWriter out = response.getWriter();
10 out.print(JSON.toJSONString(new Message<>(ServerConstant.INVALID_TOKEN.getMsg(), ServerConstant.INVALID_TOKEN.getCode())));
11 }
12 }
复制代码

Spring Security OAuth2 授权失败(401)相关推荐

  1. 将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用

    将Spring Security OAuth2授权服务JWK与Consul 配置中心结合使用 概述 在前文中介绍了OAuth2授权服务简单的实现密钥轮换,与其不同,本文将通过Consul实现我们的目的 ...

  2. Spring Security Oauth2 授权码模式下 自定义登录、授权页面

    主要说明:基于若依springcloud微服务框架的2.1版本 嫌弃缩进不舒服的,直接访问我的博客站点: http://binarydance.top//aticle_view.html?aticle ...

  3. Spring Security OAuth2 授权码模式 (Authorization Code)

    前言 Spring Security OAuth2 授权码模式 (Authorization Code) 应该是授权登录的一个行业标准 整体流程 首先在平台注册获取CLIENT_ID和CLIENT_S ...

  4. spring security oauth2 授权服务器负载均衡解决方案

    研究了好几天的授权服务对资源服务是如何实现负载均衡的 真的是丈二和尚摸不着头脑,研究了几天今天终于找到了一篇文章 真的是翻:烂了 奈何自己太菜 上一下资源服务的yml配置(oauth-server是注 ...

  5. Spring Security Oauth2 授权服务开发

    2019独角兽企业重金招聘Python工程师标准>>> 集成开发环境 ·开发工具:Eclipse/Myeclipse/IntelliJ IDEA 任选其一 ·运行环境:jdk1.7及 ...

  6. Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战

    本文源码地址 后端:https://gitee.com/youlaitech/youlai-mall/tree/v2.0.1 前端:https://gitee.com/youlaiorg/mall-a ...

  7. Spring Security + OAuth2.0

    授权服务器 授权服务器中有4个端点.说明如下: Authorize Endpoint :授权端点,进行授权. Token Endpoint :令牌端点,经过授权拿到对应的Token. lntrospe ...

  8. 004-云E办_学习Oathu2和Spring Security Oauth2

    这里写目录标题 一.Oauth2简介 1.简介 2.分析Oauth2认证的例子,网站使用微信认证的过程: 3.Oauth2.0认证流程如下: 1.角色: 2.常用术语: 3.令牌类型 4.特点 二.授 ...

  9. Spring Security Oauth2 JWT 实现用户认证授权功能

    Spring Security Oauth2 JWT 一 用户认证授权 1. 需求分析 1.1 用户认证与授权 什么是用户身份认证? 用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份 ...

最新文章

  1. Gut:华中科大蔺蓉组开发简单便捷无创肠道生物信息获取方法
  2. JS调用PageMethods(转)
  3. 8145v5 参数_如何估计模型中的参数
  4. java 中 Object XML 互转,最终选择Xstream
  5. [初级]Java中的switch对整型、字符型、字符串的具体实现细节
  6. JQuery DataTables Selected Row
  7. 明天开始新的作息时间了
  8. 【Halcon】Halcon与OpenCV介绍、比较
  9. PHP获取本月起始和终止时间戳
  10. Hadoop的安装与配置——设置单节点群集
  11. php 内链接实现三表,Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
  12. 菜鸟教程网oracle,Oracle数据库入门教程 Oracle数据库菜鸟教程
  13. 蓝桥杯官网 试题 基础练习 阶乘计算(C++ 高精度)
  14. 青少年python编程入门书-清华大学出版社-图书详情-《青少年学Python编程(配套视频教学)》...
  15. Magic Firewall 简介
  16. 价格歧视:降价促销的底层逻辑
  17. 麦克风离计算机主机多远,唱歌的时候,嘴离麦克风多远最好听?
  18. Flutter 视频播放器组件封装
  19. 视频压缩和分析方面数据集 Tencent Video Dataset (TVD)
  20. 春江花月夜--张若虚为你而颂

热门文章

  1. linux cacti 搭建,linux下搭建cacti监控(示例代码)
  2. k8s 拉取镜像失败_k8s 拉取私有仓库失败
  3. split函数python_Python numpy.hsplit函数方法的使用
  4. 以TikTok为切入的海外流量打法?
  5. 程序员的梗_程序员都背着大书包,里面到底装的什么?程序员们:钱、电脑.....
  6. 初学Go语言的学生管理系统
  7. 吴恩达机器学习练习2:Regularized logistic regression
  8. HP-Socket v5.4.4 发布,高性能跨平台网络通信框架
  9. Kubernetes Resource QoS Classes介绍
  10. 视图可以修改表数据吗_Excel-数据透视表、数据透视图