shiro真正项目中的实战应用核心代码!!!
欢迎转载!!!请注明出处!!!
说道shiro的学习之路真是相当坎坷,网上好多人发的帖子全是简单的demo样例,核心代码根本没有,在学习过程中遇到过N多坑。
经过自己的努力,终于整出来了,等你整明白之后发现,确实没那么难,只是没人告诉你,自己去想向确实不好办,只能通过看源码加上自己猜想,不断尝试。
直接看主题。我就直接说受权这了,不说认证登录了,这种帖子n多个,我要说的是真正的核心代码!!!含金量超高!!!欢迎转载!请注明出处!!!
首先看先自定义的Realm:
/**
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//获取用的id
String userId = ((User)principals.getPrimaryPrincipal()).getUserId();
//查询对应用户的角色集合
List<RoleR> roleList=userService.getRoleList(userId);
List<Menu> menuList=null;
List<String> roleAllList = new ArrayList<String>();
List<String> resourceList = new ArrayList<String>();
for (RoleR role : roleList) {
roleAllList.add(role.getRoleId()+"");
//查询对应角色的对应权限集合
menuList=userService.getMenuList(role.getRoleId());
for (Menu menu : menuList) {
if(StringUtils.isNotBlank(menu.getPermission())){
resourceList.add(menu.getPermission());
}
}
}
//赋角色
info.addRoles(roleAllList);
//赋权限
info.addStringPermissions(resourceList);
return info;
}
可能都见过这个方法,但是你们知道什么时候调用吗?
我来揭秘:
@RequestMapping("getProductList")
    @ResponseBody
    @RequiresPermissions("product:list")//这是是核心
    public String getProductList(Integer offset,Integer limit,Product product){
        page.setStrat(offset);
        page.setPagecount(limit);
        page.setObj(product);
        productService.getProductList(page);
        Map map=new HashMap();
        map.put("total", page.getPagesumcount());
        map.put("rows", page.getList());
        Gson gson=new Gson();
        String str=gson.toJson(map);
        return str;
    } 
只要你访问后台的方法上面有 @RequiresPermissions 这个注解,那么此时shiro回去访问 doGetAuthorizationInfo
这个方法,然后回去验证当前用户是否有次权限,如果没有就回抛会授权异常
但是用户是看不到的,怎么办?这时候就要用另外一个方法,进行全局异常捕获。
没错就是用
@ControllerAdvice和@ExceptionHandler(value={UnauthorizedException.class})
    @ResponseStatus(HttpStatus.UNAUTHORIZED)这些注解结合使用。用来捕获所有控制层抛来的制定异常
然后在转到制定的错误提示页面提示用户相关错误信息,如果你们用了aop拦截了controller并且是环绕通知,这时候有个坑,是捕获不到错误的。
/**
* 没有权限 异常
* <p/>
* 后续根据不同的需求定制即可
*/
@ExceptionHandler(value={UnauthorizedException.class})
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public ModelAndView processUnauthenticatedException(NativeWebRequest request, UnauthorizedException e){
System.out.println("-----------------------------------------------------");
ModelAndView mv = new ModelAndView();
mv.addObject("errorInfo", e);
mv.setViewName("unauthorized");
return mv;
}
原因因为aop拦截后抛出了更大的异常,而你捕获的是未授权,所以要重新抛出未授权

不仅仅是权限控制,也可以角色控制,一样的用法
<div id="toolbar" class="btn-group">
<shiro:hasPermission name="product:insert">
<button id="btn_add" type="button" class="btn btn-primary" onclick="addProduct()">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
</button>
</shiro:hasPermission>
<shiro:hasPermission name="product:deletes">
<button id="btn_delete" type="button" class="btn btn-warning" onclick="delProductAll()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除
</button>
</shiro:hasPermission>
<shiro:hasPermission name="product:insert">
<button id="btn_delete" type="button" class="btn btn-success" onclick="updateAllProduct()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>批量修改图片
</button>
</shiro:hasPermission>
<shiro:hasPermission name="product:excel">
<button id="btn_delete" type="button" class="btn btn-success" onclick="exportExcel()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>导出Excel
</button>
</shiro:hasPermission>
<shiro:hasPermission name="product:xml">
<button id="btn_delete" type="button" class="btn btn-success" onclick="exportXml()">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>导出Xml
</button>
</shiro:hasPermission>
</div>
如果当前用户符合这些权限,按钮就可以显示,前天要引入shiro标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
下面是我的权限表的大致结构:
下载地址:http://download.csdn.net/download/qq_38665235/9999509
这是Realm的下载地址:
下载地址:http://download.csdn.net/download/qq_38665235/9999496
shiro真正项目中的实战应用核心代码!!!的更多相关文章
- 沉淀再出发:如何在eclipse中查看java的核心代码
		沉淀再出发:如何在eclipse中查看java的核心代码 一.前言 很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进 ... 
- 在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示
		在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示) 1.使用npm安装依赖 npm install --save codemirror; 2.在页面中放入如下代码 ... 
- 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~
		一.写在前面 讲道理,这次是真的笔者很久都没有更新blog了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ... 
- 我是如何在公司项目中使用ESLint来提升代码质量的
		ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ... 
- 向项目中添加dtd文件实现代码提示
		我们在编辑代码的过程中,有代码提示的编辑工具总是受到青睐. 本文将讲解怎么在eclipse中加入dtd文件实现代码提示.myeclipse同理 选择window,选择perferences,然后拉到下 ... 
- 【React踩坑记五】React项目中引入并使用react-ace代码编辑插件(自定义列表提示)
		最近有一个引入sql编辑器插件的需求,要求代码高亮显示,代码智能提示,以及支持自定义代码提示列表等功能.中途在自定义代码提示列表中由于没有相关demo,所以踩了一些坑,遂将其整理如下,以便日后查看. ... 
- 记录一次项目中dubbo-admin实战部署
		环境: 1.centos7 2.jdk-7u76-linux-x64.tar.gz 2.tomcat:apache-tomcat-7.0.59.tar.gz 3.zookeeper-3.4.6.tar ... 
- 在maven项目中使用mybatis-generator-maven-plugin生成mybatis代码
		项目整体的目录结构如下: pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ... 
- RabbitMQ之项目中实战
		说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ... 
随机推荐
- redis的sorted set类型
			1.简单描述 和set类型一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score.sorted set的实现是skip list和hash ... 
- 【python】内部函数
- CSS之clearfix清除浮动
			.clear { clear: both; height: 0; overflow: hidden; display: block; line-height: 0 } .clearfix:afte ... 
- iOS tableview和 Collection复用机制
			TableView的重用机制,为了做到显示和数据分离, tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对ce ... 
- SQL Server 数据库引擎怎样记录完整备份后修改过的数据
			SQL Server 使用两个内部数据结构跟踪被大容量复制操作修改的区,以及自上次完整备份后修改的区.这些数据结构极大地加快了差异备份的速度.当数据库使用大容量日志恢复模式时,这些数据结构也可以加快将 ... 
- HTTP协议------->资源和URL
			1.前言 最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿- 计划用近十篇文章,详尽的说清楚以下一些问题: URL和资源.HTTP报文是什么东西? HTTP是怎样进行链接 ... 
- stack 的优势 - 每天5分钟玩转 Docker 容器技术(113)
			stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,stack 有明显的优势. YAML ... 
- [置顶]
        MVC中使用signalR入门教程
			一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ... 
- nova创建虚拟机源码分析系列之八 compute创建虚机
			/conductor/api.py _build_instance() /conductor/rpcapi.py _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ... 
- 理解new构造函数和apply以及call
			今天在看设计模式的时候,遇到一些挺低级的东西,搞不懂,顾查阅资料整理记录一番. 先了解一下new构造函数的过程: function func(){ console.log('do'); } var f ... 
