文档章节

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

ThinkGem
 ThinkGem
发布于 06/24 23:47
字数 1908
阅读 392
收藏 0
点赞 0
评论 1

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

粉丝 878
博文 136
码字总数 21994
作品 1
济南
架构师
加载中

评论(1)

申印权
申印权
session有效期直接在yml那个文件中改就行了吗
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
JeeSite4.0,一直报这个问题,求解释

DEBUG [com.jeesite.common.io.PropertiesUtils] - Loading jeesite config: [classpath:/config/jeesite-core.yml, classpath:config/jeesite.yml, classpath:config/application.yml, clas......

陈豫
05/08
0
0
JeeSite 4.0.3 发布,企业级快速开发平台

新增 新增:core项目增加单元测试支持类 ApplicationTest.java 新增:代码生成config.xml支持自定义,放同目录下config-custom.xml文件即可覆盖 新增:shiro.allowRequestMethods 参数,可指...

ThinkGem
05/30
0
0
[急]缓存报错,内测也溢出问题

使用jeesite开发的,然后报出内存溢出还有这个缓存 ,看不太懂了 求大佬指教一下

微晨灬晨
06/28
0
0
jeesite shiro+redis实现cache和session共享

jeesite这个开源框架本身集成的有shiro+redis来实现cache和session共享,但是需要修改一下文件配置即可 首先找到spring-context-shiro.xml文件 找到bean id为sessionDAO,将其修改为如下 <!...

wangxujun59
06/21
0
0
jeesite部署时,竟然浪费了1个小时!

在家里部署jeesite,跑起来以后打开浏览器去访问可是怎么都访问不了。工程也没报错。各种尝试之后发现在家将TOMCAT 的端口改成80了 ,一直访问的是8080 所以才访问不了的。之前也想过可能是t...

无敌小学僧
2017/10/29
0
0
整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考

1.整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考。 2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里。 3. 如果你发现信息描述有误请联系我,我会及...

写代码的奥特曼
2017/10/23
0
0
JeeSite 4.0 说说前端的那些事

引言 一个不得不说的话题,经过近几年的发展,Web前端开发已经不是一个新有的岗位了,前端技术发展非常迅速,技术更新换代也很快,对于前端工程师来说是一个很大的挑战“挣扎期”。 从统计来...

ThinkGem
2017/11/05
0
41
企业信息化快速开发平台--JeeSite

JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台。 JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyB...

thinkgem
2013/02/24
229.6K
49

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
3
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部