本文的环境是参考这篇《Spring Cloud OAuth2 实现用户认证及单点登录”》搭建的。
问题描述
当前已经获取到了access_token,根据access_token请求自己的接口时报了401,token验证有问题。
我自己的接口是:
/**
* 一个 RESTful 方法,只有当访问用户具有 ROLE_ADMIN 权限时才能访问,否则返回 401 未授权。
*
* 通过 Authentication 参数或者 SecurityContextHolder.getContext().getAuthentication() 可以拿到授权信息进行查看。
* @param authentication
* @return
*/
@GetMapping("get")
@PreAuthorize("hasAnyRole('ROLE_ADMIN')")
public Object get(Authentication authentication){
authentication.getCredentials();
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
String token = details.getTokenValue();
return token;
}
解决方式
org.springframework.security.oauth2.provider.token.RemoteTokenServices
我们将这个类复制出来,在java下创建相同的包名,类。
源码图
在源码中,这里返回的active应该得为Boolean类型,但是这个map的值是个Object,返回直接返回了个String类型。
他使用了Boolean和String类型进行比较,所以我得到的返回结果永远都是false了,就一直走了这个异常。(具体他为什么会这样来比较,我真不太懂,欢迎大佬们在评论里指点一下)
修改后的图
那么我的处理就比较简单粗暴了,直接把这个类提出来,然后把这个Boolean.TRUE.toString()一下。类型一致,比较就正常了。
再次去请求,现在就没有问题了,返回成功
本文只是个人在学习过程中的一次排查处理过程,如果有更好的见解欢迎大佬们指点。
限时特惠:本站每日持续更新海内外内部创业教程,一年会员只需88元,全站资源免费下载点击查看详情。
站长微信:nnxmw123
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。