上面文章介绍了Shiro身份认证原理,权限验证和身份认证原理都是通过自定义Realm域实现,看这篇文章前可以阅读下上篇文章。

环境

基于SpringBoot开发

Shiro需要的依赖:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.4.2</version>
</dependency>

权限验证流程

Shiro实现权限验证的几种方式

  • 过滤器拦截
    通过URL规则对请求筛选,对应URL规则有对应的处理方式。后面会说。
  • JSP页面,页签权限处理
    首先要在JSP页面进入表签,:
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>
<shiro:hasPermission name="Permission">
</shiro:hasPermission>
  • 注解实现
    Shiro在Spring中提供了以下注解,下面内容会基于注解来实现权限认证。
注解 解释
@RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时。
@RequiresUser 验证用户是否被记忆,user有两种含义:一种是成功登录的(subject.isAuthenticated() 结果为true);另外一种是被记忆的(subject.isRemembered()结果为true)
@RequiresGuest 验证是否是一个guest的请求,与@RequiresUser完全相反。换言之,RequiresUser == !RequiresGuest。此时subject.getPrincipal() 结果为null.
@RequiresRoles 如果subject中有对应的角色才可以访问方法。如果没有这个权限则会抛出异常AuthorizationException。
@RequiresPermissions 要求subject中必须有对应的权限才能执行方法。否则抛出异常AuthorizationException。
  • 代码中实现
    在方法中,先判断用户权限,在处理业务,不推荐使用。

注解的权限认证的实现原理

  • 下面是一个删除的方法,使用了@RequiresPermissions注解,既当前用户必须含有这个权限才能执行userDel方法。可以看到权限内容为 “user:del”,为什么要这么写,这里为了易读权限,有一个规范:模块名:权限功能,如果项目结构更复杂,可以更细致,方便阅读。
@RequiresPermissions("user:del")
public String userDel(){System.out.println("用户信息删除方法");return "删除成功";
}
  • 这样权限就完成了,当请求到了方法,会先去验证权限,Shiro默认配置为ini文件,如下:在User后面跟着角色名,Shiro权限认证会根据这里的数据进行验证,认证通过会执行方法,不通过会抛出权限异常。
[users]
zhangsan=zs,role1,role2
lisi=ls[roles]
role1=sys:user:insert,sys:user:delete
role2=delete,update
  • 在AuthorizingRealm域中,Shiro会通过isPermitted,isPermittedAll,hasRole,hasRoles等方法来实现对权限的认证;
public abstract class AuthorizingRealm extends AuthenticatingRealm implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAware {public boolean isPermitted(PrincipalCollection principals, Permission permission) {}public boolean isPermittedAll(PrincipalCollection subjectIdentifier, String... permissions) {}public boolean hasRole(PrincipalCollection principal, String roleIdentifier) {}public boolean[] hasRoles(PrincipalCollection principal, List<String> roleIdentifiers) {}
}
  • 到这里,我们清楚了Shiro权限认证的流程,只要我们配置好用户角色,把对应的权限给Shiro,Shiro的注解会自动帮助我们验证权限,但是,上面我们是把用户角色权限这些数据放置到配置文件中,实际开发中,我们一般都会使用数据库来处理,那么要怎么把数据库的资源给Shiro呢?

自定义Realm实现权限认证

  • 上面我们已经知道Shiro通过AuthorizingRealm域实现权限认证,我们直接去自定义一个域实现即可。
@Component
public class MyRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;/*** 登录认证自定义逻辑方法* 自定义登录认证的逻辑,配置生效后,当shiro的login方法被执行时,底层会* 自动的调用该方法完成登录认证,而不是使用shiro自己内置的登录认证逻辑*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {return null;}/*** 自定义授权方法* 每一个授权都会走到这里验证* 该方法是有shiro自动触发,调用该方法获取当前认证成功的用户权限信息,* 然后shiro获取当前方法的返回值后,自动的进行权限效验,如果效验成功* 则正常执行对应的资源;效验失败则报错。*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("自定义授权开始...");String uname= (String) principalCollection.getPrimaryPrincipal();// 1.查询当前用户具备的权限信息List<String> list=userService.selPowerInfoService(uname);// 查询当前用户的角色信息List<String> list2=userService.selRoleInfoService(uname);// 2.将当前用户具备的权限信息给shiroSimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();simpleAuthorizationInfo.addStringPermissions(list);simpleAuthorizationInfo.addRoles(list2);// 3.返回return simpleAuthorizationInfo;}
}
  • SimpleAuthorizationInfo对象储存Shiro的角色以及权限信息,这里我们将项目的资源给它,Shiro便拿到了权限资源。
  • 当请求进入,遇到注解权限时,会自动进入到自定义授权验证方法中读取权限,然后Shiro会自动根据注解的权限和这里我们给的权限进行比对,就完成了权限认证。

关于自定义的Realm这里完成后,还需要在Shiro配置中去关联处理,下篇文章会一一说明。

Shiro 权限验证原理相关推荐

  1. shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明

    为目前使用的是shopnc商场二次开发,shopnc本身做了qq互联和微博快捷登陆的api,做成了集成通用的接口 首先说下基本的这种类型的api访问方式,首先,的有个配置文件,配置你申请的id和key ...

  2. java shiro做页面显示_Java-Shiro(八):Shiro集成SpringMvc、Themeleaf,如何实现Themeleaf视图引擎下解析*.html中shiro权限验证...

    我们知道如果是采用jsp视图引擎,直接在jsp中加入shiro的tag就可以,然而在thymeleaf视图引擎下,并未有shiro的tag lib.实际上目前shiro+Thymeleaf的html页 ...

  3. shiro登录验证原理

    1.subject.login 这个是我们自己的代码,也是登录验证的开始 2.securityManager.login 直接进去就是到了DelegatingSbuject的login()方法,进去s ...

  4. 前后端分离之权限验证

    前后端分离之权限验证 原理:将登录验证的请求头中后端生成的秘钥(token)接收后存储在cookie内,在再次请求数据时添加在请求头中发送给后端验证,请求数据. 代码: 登录ajax: $scope. ...

  5. springboot+shiro+jwt实现登录+权限验证

    目录 一.简介: JWT优点: JWT缺点: shiro: JWT: 1.JWT头 2.有效载荷 3.签名哈希 4.Base64URL算法 二.实现 1.引入maven依赖 2.编写shiro配置类 ...

  6. 简单扩展shiro 实现NOT、AND、OR权限验证(支持复杂一点的表达式)

    2019独角兽企业重金招聘Python工程师标准>>> 简单扩展shiro 实现NOT.AND.OR权限验证(支持复杂一点的表达式) .https://my.oschina.net/ ...

  7. 权限验证框架Shiro

    权限验证框架Shiro: Shiro简介 什么是Shiro: shiro是一个强大易用的Java安全框架,提供了认证,授权,加密,回话管理等功能: 认证(Authentication):用户身份识别, ...

  8. Shiro之前后端分离权限验证返回302错误

    Shiro和Spring集成,在XML文件中配置如下部分(非全部配置): <!-- Shiro权限管理 --> <bean id="shiroSecurityFilter& ...

  9. springMVC整合shiro权限框架示例与实践

    2019独角兽企业重金招聘Python工程师标准>>> 为什么写这篇文章 看过那么多框架.教程,大部分shiro的文章或教程是我见过思路最糟糕的.作者完不清楚想要表达什么起到什么作用 ...

  10. Spring Boot Shiro 权限管理

    Spring Boot Shiro 权限管理 标签: springshiro 2016-01-14 23:44 94587人阅读 评论(60) 收藏 举报 本来是打算接着写关于数据库方面,集成MyBa ...

最新文章

  1. 让机器听懂世界,触及人类梦想还有多远?
  2. android按钮随机数,Android随机数
  3. Android开发六 电话拔号器
  4. 6410 linux内核移植
  5. 单页vue路由router
  6. 376 Wiggle Subsequence 贪心解法以及证明
  7. java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码
  8. 远程线程需要注意的问题
  9. 强大的SqlCacheDependency【转】
  10. mysql 注册驱动_mysql8.0以上版本注册驱动并建立数据库的连接公共代码
  11. Windows as a Service(3)——使用SCCM管理Windows10更新
  12. 物流知识分享——浅析库存日结作业
  13. 【C++ Primer 第10章】 10.4.1 插入迭代器
  14. Python打印杨辉三角
  15. openpyxl批量删除表格中的空白行,并处理数据样式
  16. [转帖]星际和魔兽的区别
  17. 三八定律时间管理思想
  18. Android动画 补间动画
  19. 旋转卡壳凸包(不用一下子就学完所有)
  20. 微信小程序 扫码 加载图片

热门文章

  1. vue 浏览器地址是ip_Vue实战041:获取当前客户端IP地址详解(内网和外网)
  2. 怎样才能查到4S店保养记录,4S店维修保养记录怎样查询,Javascript学习指南
  3. 工业非标设备远程运维方案
  4. Java编译运行命令
  5. pycharm2020版本以上中文版教程
  6. 层次分析法AHP及Python实现
  7. 文武双全!为什么数据分析师需要既懂业务又懂技术
  8. 关于IDM下载器免费注册这件事
  9. 计算机哪个专业学linux_5种用于计算机维修的专业Linux发行版
  10. 小波神经网络模型matlab,神经网络预测模型优点