Shiro权限控制-区分Ajax请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro权限控制-区分Ajax请求相关的知识,希望对你有一定的参考价值。

一、为什么要区分Ajax请求?

在前台使用EasyUI的系统中,所有的请求可以分为两大类:

1)跳转到页面

2)返回Json数据

这时当请求来了时要区分处理,如果是”跳转到页面”的请求,需要跳到没有权限的页面,否则“返回Json数据”的请求,需要返回一个Json数据{success:false,message:权限不足!}


二、实现原理分析
技术分享

2.1 原有实现分析

原来权限执行分析:

1)当用户访问需要有权限才能访问资源;

2)会交给PermissionsAuthorizationFilter判断是否有权限;

3)如果没有权限会调用onAccessDenied这个方法完成跳转没有权限界面;

问题:由于PermissionsAuthorizationFilter onAccessDenied没有区分是否Ajax来单独处理。怎么区分?区分出来怎么处理?


2.2 新实现分析2.3.1 如何区分ajax

Ajax请求请求头如下:


技术分享


非Ajax请求头如下:


技术分享


只要咱们从请求头中能够获取X-Request-with的请求头说明就是Ajax请求。


2.3.2 如何处理

原生的权限处理过滤器中并没有区分AJax,所有我们要继承它,并且实现它的没有权限的方法,在里面实现Ajax的区分处理。而这些操作都需要定义新的过滤器。

对于过滤器需要经历下面的步骤:

1)定义一个过滤器的类

2)在shiro中声明过滤器的类,让它可以用来处理权限

3)配置使用新的过滤器

具体实现参考区分Ajax实现


三、区分Ajax实现3.1 定义一个过滤器的类

该类继承PermissionsAuthorizationFilter,具体实现如下:


技术分享


3.2 申明为shiro的过滤器

shiro中声明过滤器的类,让它可以用来处理权限上。

技术分享


3.3 配置使用新的过滤器
技术分享
四、总结

Shiro对权限的处理,并没有区分是否是Ajax请求,需要我们自己写过滤器来实现。在实现时通过获取请求头X-Request-with是否有值来区分,区分开来以后,对于普通请求直接跳转到没有权限的页面,对于AJax请求返回一个没有权限的JSon数据。


感谢源码时代Java学科讲师提供此文章!

本文为原创文章,转载请注明出处!


以上是关于Shiro权限控制-区分Ajax请求的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十四):权限控制(Shiro 注解)

自己动手实现简单权限控制

shiro权限控制有哪几张数据表

Shiro + SSM(框架) + Freemarker(jsp)

了解权限控制框架shiro 之实际应用.

自己动手实现简单权限控制