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之项目中实战
说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ...
随机推荐
- 非等高cell实战(01)-- 实现微博页面
非等高cell实战(01)-- 实现微博页面 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战来整合一下. 首先看一下效果图: 需求分析 此页面为非等 ...
- iOS开发 字符串的转化 小技巧
/字典或者数组转化为nsstring NSArray *arr = [NSArray arrayWithObject:@"1"]; NSString *str = [arr JSO ...
- NodeJs学习笔记(四)---单元测试
sailsjs框架用了一段时间了,感觉如果功能复杂了,非常难以处理,想用一下单元测试,看是否能解决问题. sailsjs的官方文档使用的是mocha,我搜索了一些资料,主要参考了朴灵 ...
- MongoDB入门系列(二):Insert、Update、Delete、Drop
概述 本章节介绍Insert.Update.Delete.Drop操作基本语法. 环境: Version:3.4 insert insert()基本语法如下: db.collection.insert ...
- 用keras作CNN卷积网络书本分类(书本、非书本)
本文介绍如何使用keras作图片分类(2分类与多分类,其实就一个参数的区别...呵呵) 先来看看解决的问题:从一堆图片中分出是不是书本,也就是最终给图片标签上:“书本“.“非书本”,简单吧. 先来看看 ...
- deepin系统下安装git
1.打开命令行 2.输入 sudo apt-get update sudo apt-get install git 3.显示 建议安装: git-daemon-run | git-daemon-sys ...
- 随便说说 post-processing
九月份一篇博都没更新,这段时间一直在unity的坑里爬不起来,感觉真的很绝望啊,仿佛对生活都失去了信心. 渲染问题并没有解决,目前方案只是减轻视觉冲突,降低违和感.项目AR产品也做的越来越艰难,开始经 ...
- centos 系统日志
Linux系统日志主要有三类:连接时间日志.进程统计日志和错误日志 连接时间日志 连接时间日志由多个程序执行,把记录写入到/var/og/wtmp和/var/run/utmp.ogin等程序更新wtm ...
- js选中文字兼容性解决
function selectText(){ if(document.selection){ //ie return document.selection.createRange().text; } ...
- h5拖拽上传图片
h5实现拖拽上传图片 本文将为大家介绍如何通过js实现拖拽上传图片. 首先我们要禁用调浏览器默认的拖拽事件: window.onload = function(){ //拖离 document.add ...