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

时间: 2024-10-04 23:01:48

shiro真正项目中的实战应用核心代码!!!的相关文章

iOS对项目中所有加阴影的代码进行优化

1. 对项目中所有加阴影的代码进行优化 目前项目中尤其是表格单元格中使用如下加阴影代码严重影响性能(5.2.5航班查询结果页卡顿的原因)     self.cellBG.layer.shadowColor = [[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1] CGColor];     self.cellBG.layer.shadowOffset = CGSizeMake(1, 1);     self.cellBG.layer.sha

在一个项目中同时使用Swift和Objective-C代码混合编程的方法

主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法. Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift

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

沉淀再出发:如何在eclipse中查看java的核心代码 一.前言   很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进去就可以了. 二.解决办法  2.1.打开配置    首先我们打开windows->preferences->java->install jres,在弹出的界面中选中并编辑:      然后选中rt.jar包,增加依赖: 2.2.添加代码文件 那么这个依赖在哪里呢,其实我们仔细查找就会发现,

shiro权限项目中的简单应用

SpringMVC+maven 项目需要使用shiro,所以自学了几天,仅提供给新手,请根据文档查看-该项目仅是测试项目,并不完善,只实现了需要使用的基本功能,并且只提供了使用shiro模块的代码.楼主新人第一次写,如有问题希望能提出来,由衷的感谢. 首先是pom.xml: <dependency>     <groupId>org.apache.shiro</groupId>     <artifactId>shiro-core</artifactI

项目中考核参数映射集代码片段

1. QuestionnairesService类中:         /**  * 获取岗位id-问卷id的映射, 一个岗位可能会对应两份试卷(业绩卷.能力态度卷)  *   * @return  */ public Multimap<Long, Long> getPostQuestMap() { // 当前考评周期 AppraisalPeriod period = testingService.getLast().getAppraisalPeriod(); Multimap<Long

Spark-项目中分析日志的核心代码

代码 LogRecord 类: case class LogRecord ( clientIpAddress: String, rfc1413ClientIdentity: String, remoteUser: String, ` dateTime: String, //[day/month/year:hour:minute:second zone] request: String, httpStatusCode: String, bytesSent: String, referer: Str

Activiti学习——整合ActivitiModeler到项目中

学习来源 自己学习Activiti,主要是通过拆解和重新组装咖啡兔的项目而学习的. 咖啡兔博客:http://www.kafeitu.me/ 项目地址:https://github.com/henryyan/kft-activiti-demo 基础准备 上面的GitHub中有maven版本和no-maven版本,我下的是no-maven版本 kft-activiti-demo-no-maven下载 解压并部署项目 项目结构,报错地方是xml或者js文件,可以忽略 项目 本文就是为了将对应功能拆分

在Python Web项目中使用Jenkins进行持续集成

在一个项目的开发过程中,往往会有一些需要反复执行的操作,比如编译.测试.部署.具体于Flask项目,我一般使用nose执行单元测试.fabric进行部署.pylint执行代码质量检测等.这些频繁需要执行的步骤,是非常枯燥的,那何不交给机器来自动执行呢?最近,我参与的一个校内团队也遇到了类似的问题,于是打算调研一下相关的工具. 还是习惯性地查阅了下Kenneth Reitz大神的python-guide,果然找到了关于CI的章节.选来选去,最终没有选择Python Stack的Buildbot,而

项目中引入IconFont

1.登录iconFont官网 2.选中需要的icon,添加入库 3.添加至项目 4.添加到自己的项目中,点击更新代码,并复制此代码,并单击下载至本地 5.解压后只复制iconfont.css,放入自己的项目中并正确引入 . 6.我放到styles文件夹中了 7.在index.scss中引入了 . 8.打开 iconfont.css,把下面的复制的代码替换 iconfont.css中的 @font-face,就可以在项目中引用图标字体了. 9.如果想添加新的图标,只需更新 @font-face代码