Soul网关-day07
Soul-plugin-sofa测试(二)
在day05的时候,出现了一个bug,是由于2.2.1的版本没有sofa相关的插件;所以更新到了最新的版本,但最新版本在运行过程中报了一个错误,就是:
o.d.s.a.shiro.bean.StatelessAuthFilter : token is null.
可以看到是在StatelessAuthFilter处:
public class StatelessAuthFilter extends AccessControlFilter {
private static final String HEAD_TOKEN = "X-Access-Token";
@Override
protected boolean onAccessDenied(final ServletRequest servletRequest, final ServletResponse servletResponse)
throws Exception {
....省略其他代码
String tokenValue = httpServletRequest.getHeader(HEAD_TOKEN);
if (StringUtils.isBlank(tokenValue)) {
log.error("token is null.");
unionFailResponse(servletResponse);
return false;
}
...省略其他代码
}
}
可以看到这里是从我们的请求request上找到一个叫X-Access-Token的东西,debug了一下发现为null
用postman测试下soul-admin的登录接口,看看是否真正的生成了token,可以得到以下的json数据:
{
"code": 200,
"message": "login dashboard user success",
"data": {
"id": "1",
"userName": "admin",
"password": "jHcpKkiDbbQh7W7hh8yQSA==",
"role": 1,
"enabled": true,
"dateCreated": "2018-06-23 15:12:22",
"dateUpdated": "2018-06-23 15:12:23",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTIxMzY0NX0.T3O900IOBcHHHRY9uWP46IhgDZXdaAXru2-bAbMq898"
}
}
可以看出我们的登录请求生成了token的数据。
那么随便找一个报token为null的 接口 在postman进行测试,这里选择:
User这个接口,访问的请求是:http://localhost:9095/dashboardUser?currentPage=1&pageSize=12,在Headers中加入soul-admin需要鉴权的属性:X-Access-Token,并将login请求得到的token值赋给这个Headers属性。
不同于我soul-admin控制台报401错误,可以正常的得到结果,结果如下:
{
"code": 200,
"message": "query success",
"data": {
"page": {
"currentPage": 1,
"prePage": 1,
"nextPage": 1,
"pageSize": 12,
"offset": 0,
"totalPage": 1,
"totalCount": 1
},
"dataList": [
{
"id": "1",
"userName": "admin",
"password": "123456",
"role": 1,
"enabled": true,
"dateCreated": "2018-06-23 15:12:22",
"dateUpdated": "2018-06-23 15:12:23"
}
]
}
}
那么可以猜测可能是在存token的时候出了问题,因为既然程序需要从request中得到X-Access-Token这个属性,那么在组建对后端请求的时候不可能不会携带这个token。
而目前出现的错误是,在StatelessAuthFilter这个类中,判断是否拒绝请求的方法**onAccessDenied(final ServletRequest servletRequest, final ServletResponse servletResponse)**时,取出来的token为空。
所以才会通过**unionFailResponse(servletResponse)**这个类,往我们请求的response结果中塞入请求失败的信息。
…To BeContinue