今天在开发的时候遇到一个很奇怪的问目前问题 项目采用的是apache shiro作为权限控制的框架,以前没用过,昨天配置好了shiro也可以正常启动,配置也都生效了 当我在某一个接口上添加了@RequiresRoles校验角色时问题出现了,首先是根本不生效,后来我把SpringMvc的配置文件按照各路大神说的修改之后就ok了,然后更大的问题出现了,因为我们是Android端访问后台接口,当app访问此接口时报错UnauthenticatedException 提示信息来看是认证出现了问题,后来一路断点调试下来 发现认证没有问题,已经正常登陆了
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(Info.getUserName(), Info.getPassword());
subject.login(token);
boolean hasRole = SecurityUtils.getSubject().hasRole("user");
boolean hasRoles = SecurityUtils.getSubject().hasRole("scene");
System.out.println(hasRole);
System.out.println(hasRoles);
这两块内容第二个是true,完全正确的,既然已经登录认证成功了那为什么还会出现认证失败的问题呢,后来我用postman测试
{
"success": false,
"msg": "",
"obj": {
"msg": "签名异常",
"success": false
}
居然成功访问,已经进去了,因为参数是我随便填写的所以签名是错的,但是访问是没有问题的,那现在的问题就是Android端不能访问这个加了@RequiresRoles的接口,但是我用postman先调用登录接口认证之后再调用这个接口是可以正常访问的,苦思良久,发现这个请求根本就有问题,第一 http是无状态请求,shiro是根据什么判断我那一万台手机呢,应该有个cookie或者sessionId之类的果不其然 发现了问题的所在
服务器返回了一个cookie 里面有sessionId,postman测试时是有带这个cookie的,在移动端把cookie加上 问题顺利解决。