欢迎转载!!!请注明出处!!!

说道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真正项目中的实战应用核心代码!!!的更多相关文章

  1. 沉淀再出发:如何在eclipse中查看java的核心代码

    沉淀再出发:如何在eclipse中查看java的核心代码 一.前言   很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进 ...

  2. 在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示

    在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示) 1.使用npm安装依赖 npm install --save codemirror; 2.在页面中放入如下代码 ...

  3. 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~

    一.写在前面 讲道理,这次是真的笔者很久都没有更新blog了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...

  4. 我是如何在公司项目中使用ESLint来提升代码质量的

    ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...

  5. 向项目中添加dtd文件实现代码提示

    我们在编辑代码的过程中,有代码提示的编辑工具总是受到青睐. 本文将讲解怎么在eclipse中加入dtd文件实现代码提示.myeclipse同理 选择window,选择perferences,然后拉到下 ...

  6. 【React踩坑记五】React项目中引入并使用react-ace代码编辑插件(自定义列表提示)

    最近有一个引入sql编辑器插件的需求,要求代码高亮显示,代码智能提示,以及支持自定义代码提示列表等功能.中途在自定义代码提示列表中由于没有相关demo,所以踩了一些坑,遂将其整理如下,以便日后查看. ...

  7. 记录一次项目中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 ...

  8. 在maven项目中使用mybatis-generator-maven-plugin生成mybatis代码

    项目整体的目录结构如下: pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  9. RabbitMQ之项目中实战

    说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ...

随机推荐

  1. springboot+jpa+thymeleaf增删改查的示例(转)

    这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...

  2. .NET 绝对路径的配置

    有时候因为用IIS配置网站,会导致一些全局引用有路径问题无法引用到.今天就说一下,关于全局引用的绝对路径的配置,譬如,由于IIS配置的虚拟路径,一些CSS,JS的引用找不到,又或者自定义的一些跳转出现 ...

  3. 【深度学习系列】用PaddlePaddle和Tensorflow实现GoogLeNet InceptionV2/V3/V4

    上一篇文章我们引出了GoogLeNet InceptionV1的网络结构,这篇文章中我们会详细讲到Inception V2/V3/V4的发展历程以及它们的网络结构和亮点. GoogLeNet Ince ...

  4. case

    case $变量 in "值1") 执行语句; ;; "值2") 执行语句; ;; ... *) 默认执行语句 ;; esac #!/bin/bash read ...

  5. 后台返回数据事null时怎么进行判断

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  6. go实例之排序

    1.默认排序 使用sort包进行排序.排序是就地排序,因此它会更改给定的切片,并且不返回新的切片. package main import "fmt" import "s ...

  7. epoll的使用实例

    在网络编程中通常需要处理很多个连接,可以用select和poll来处理多个连接.但是select都受进程能打开的最大文件描述符个数的限制.并且select和poll效率会随着监听fd的数目增多而下降. ...

  8. [数据结构]C语言链表实现

    我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们 ...

  9. xamarin android checkbox自定义样式

    xamarin android checkbox自定义样式 在drawable文件在新建checkbox_bg.xml文件 <?xml version="1.0" encod ...

  10. 【原创】java NIO FileChannel 学习笔记 FileChannel 简介

    java NIO 中FileChannel 的实现类是  FileChannelImpl,FileChannel本身是一个抽象类. 先介绍FileChannel File Channels 是线程安全 ...