文档章节

JeeSite 4.0 功能权限管理基础(Shiro)

ThinkGem
 ThinkGem
发布于 06/24 23:47
字数 1908
阅读 2028
收藏 0

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。

只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

用户身份认证

用户去访问系统,系统需要验证用户身份的合法性,证明您是否是合法的用户。

最常用的用户身份验证的方法:

  1. 用户名、密码方式
  2. 用户名、安全密钥方式
  3. 基于硬件或证书验证方法

系统验证用户身份合法,用户方可访问系统的资源。

从用户认证我们可以抽取出:

  • 主体对象(Subject):理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证,获取方法:UserUtils.getSubject()
  • 身份信息(Principal):通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息(Primary principal),获取方法:UserUtils.getLoginInfo()

用户权限授权

可简单理解为访问控制,在用户身份认证通过后,系统对用户访问菜单或按钮进行控制。也就是说,该用户有身份进入系统了,但他不一定能访问系统里的所有菜单或按钮,而他只能访问管理员给他分配的权限菜单或按钮。

  • Permission(权限标识):针对系统访问资源的权限标识,如:用户添加、用户修改、用户删除,判断方法:UserUtils.getSubject().isPermitted(permissions);

权限管理模型

  • 用户:登录账号、密码、用户类型
  • 角色:角色名称、归属用户类型
  • 菜单:菜单名称、菜单URL、权限标识
  • 用户角色关系:用户编码、角色编码
  • 角色菜单关系:角色编码、菜单编码
【用户】<---多对多--->【角色】<---多对多--->【菜单/权限】

管理员类型:

  • 超级管理员:主要为开发者使用的最高级别管理员,主要用于开发和调试,有些修改会直接影响系统的正常运行。
  • 系统管理员:主要为客户方使用的管理员,用于一些基础数据配置,如机构、用户、权限、用户字典等,默认账号为admin。
  • 二级管理员,是由系统管理员指定的,可以分担系统管理员的工作,可以管理用户、分配菜单权限和操作权限一种特殊角色,但它仅具备系统管理员指定范围的管理数据。

菜单权重

菜单权重是指什么样的用户或管理员可以操作或访问什么级别的菜单,对菜单的权重级别进行划分,比如:比较重要敏感的菜单,只有管理员才可以拥有。如下:

  1. 超级管理员可以访问二级管理员、系统管理员、超级管理员权重的菜单,但不允许访问默认权限(业务菜单);
  2. 系统管理员可以访问超级管理员指定给他的系统管理员及以上权限的部分菜单;
  3. 二级管理员可以访问超级或系统管理员指定给他的二级管理员及以上的部分菜单;
  4. 普通用户只能访问管理员指定给他的默认权重的菜单。

菜单权重的设置,会影响角色授权菜单的时候,列出的菜单和权限列表:

  1. 如果当前用户管理身份为二级管理员,则列出的是二级管理员菜单权重以下的菜单;
  2. 如果当前用户管理员身份是系统管理,则列出的是系统管理员菜单权重以下的菜单;
  3. 如果当前用户管理员身份是超级管理员,则列出的是超级管理员菜单权重下的菜单。

此举是为了更好的提高授权安全,不能越级授权,权限互相牵制等。

支持四种授权方式:

  • 编程式:通过if/else代码块来完成。
  • 注解式:通过在执行的方法上放置相应的注解来完成,没有权限则抛出相应异常。
  • 视图页面: 在JSP/GSP页面通过相应的标签完成。
  • 基于URI拦截:根据URI匹配,决定访问权限。

编程式

Subject subject = UserUtils.getSubject();
subject.isAuthenticated(); // 是否身份验证授权通过
subject.isPermitted(permission); // 验证权限字符串
subject.isPermittedAll(permissions); // 验证权限字符串全部通过
subject.hasRole(roleIdentifier); // 验证是否有角色权限

例如:

if (subject.isPermitted("sys:user:edit")){
    System.out.pirntln("当前用户有编辑用户权限");
}

注解式

在Controller的方法上指定如下注解:

  • @RequiresPermissions (value={“sys:user:view”, “sys:user:edit”}, logical= Logical.OR):表示当前 Subject 需要权限 user:view 或 user:edit。
  • @RequiresRoles(value={“admin”, “user”}, logical=Logical.AND):表示当前 Subject 需要角色 admin 和 user
  • @RequiresAuthentication:表示当前Subject已经通过login进行了身份验证;
  • @RequiresUser:表示当前 Subject 已经身份验证或者通过记住我登录的。
  • @RequiresGuest:表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。

例如:

@RequiresPermissions(value="sys:user:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated User user, HttpServletRequest request) {
}

注意:

  • 权限字符串命名规则:模块:功能:操作,例如:sys:user:edit
  • 权限字符串Permission:指定权限串必须和菜单中的权限标识匹配才可访问

视图页

  • 单个权限验证:${hasPermi('sys:user:edit')}
  • 多个AND关系:${hasPermi('sys:user:view,sys:user:edit', 'and')}
  • 多个OR关系:${hasPermi('sys:user:view,sys:user:edit', 'or')}

例如:

<% if(hasPermi('sys:user:edit')){ %>
	<a href="${ctx}/sys/user/form" class="btn btn-default btnTool"
	    title="新增用户"><i class="fa fa-plus"></i> 新增</a>
<% } %>

基于URI拦截

jeesite.yml:

shiro:
  # URI 权限过滤器定义
  filterChainDefinitions: |
    /ReportServer/** = user
    ${adminPath}/** = user

格式:

URI地址及通配符 = 过滤器名称(支持多个,用英文逗号分隔并加双引号)

以上权限过滤器定义配置,是依照由上到下的第一次匹配优先原则,优先匹配成功的URI优先受用,支持通配符。

URI通配符:

?  :匹配一个字符。
*  :匹配零个或多个字符串。
** :匹配路径中的零个或多个路径。

认证过滤器名称:

  • anon: 例如/a/**=anon没有参数,表示可以匿名使用。
  • authc:例如/a/sys/user/**=authc表示需要认证(登录)才能使用,没有参数
  • user:例如/a/sys/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

授权过滤器名称:

  • perms:例如/a/sys/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/a/sys/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
  • roles:例如/a/sys/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如/a/sys/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

© 著作权归作者所有

共有 人打赏支持
ThinkGem

ThinkGem

粉丝 1016
博文 137
码字总数 22174
作品 1
济南
架构师
私信 提问
加载中

评论(1)

申印权
申印权
session有效期直接在yml那个文件中改就行了吗
ThinkGem/JeeSite 4.0

引言 JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:...

ThinkGem
02/25
0
0
jeesite配置指南(官方文档有坑,我把坑填了!)

版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/72871340 昨天,远在苏州的朋友找我一起做个私活,主要用到jeesite。 说实话,开发了这么多年的...

qing_gee
2017/06/05
0
0
JeeSite环境搭建及运行和打包(master20161117)

涉及的软件: 1、phpStudy(主要用MySql) 2、maven3(用于依赖包,下面我将上传已经下载好所有依赖包的版本,保证运行正常) 具体操作: 0、前言 由于GitHub上的Release版本没有及时更新,所...

easonjim
2016/11/18
0
0
jeesite 快速开发平台 初体验

http://www.jeesite.com/ GitHub:https://github.com/thinkgem/jeesite 开源中国:http://git.oschina.net/thinkgem/jeesite 更多文档 https://github.com/thinkgem/jeesite/tree/master/do......

晨猫
05/21
0
0
ThinkGem/JeeSite 4.0 JFlow工作流引擎-表单引擎

项目介绍 jeesite4-jflow jeesite4-JFlow 是jeesite集成JFlow的版本. 您即可以使用jeesite的敏捷性开发,也可以使用JFlow的流程引擎,表单引擎的功能. 我们已经把jeesite与jflow的组织结构集...

ThinkGem
08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
昨天
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
昨天
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
昨天
2
0
【分享实录】BANCOR算法详解及代码实现

1 活动基本信息 1)主题:【区块链技术工坊22期】BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何开发自己的BANCOR去中心...

HiBlock
昨天
2
0
微信小程序(2)

开始看微信小程序的教程了。刚刚看完官方教程的视图层部分。这里摘录一些自己认为的部分关键点。 1.直接修改数值无法重新渲染,需要使用setData()方法; 2.列表渲染中:wx:key用于保持项目在...

MKjy
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部