ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ApacheShiro 框架入门

2021-04-15 10:07:54  阅读:139  来源: 互联网

标签:控制 ApacheShiro Realm 入门 框架 访问 Shiro 权限 shiro


三、 ApacheShiro 框架入门
1. Apache Shiro 框架简介和下载导入
实现权限控制, 可以自己写代码实现 (粗粒度权限控制 Filter、 细粒度权限控制 自
定义注解、代理、反射技术)
1、自己写权限框架
2、Spring Security (使用复杂, 依赖 Spring )
3、Apache Shiro (更轻量, 使用更简单, 并不完全依赖 spring,可以独立使用 )

官网: http://shiro.apache.org/

Apache Shiro 体系结构

1、Authentication 认证 ---- 用户登录,身份识别 who are you?
2、Authorization 授权 — 用户具有哪些权限、角色 what can you do ?
3、Cryptography 安全数据加密
4、Session Management 会话管理
5、Web Integration web 系统集成
6、Interations 集成其它应用,spring、缓存框架

最新版本 1.3.2

参考官方贵方: Apache_Shiro_reference(中文版).pdf

2. Apache Shiro 执行过程分析 和 权限控制主要方式
2.1. Shiro 运行主要运行流程

ApplicationCode 用户编写代码  
Subject 就是 shiro 管理的用户  
SecurityManager 安全管理器,是 shiro 权限控制核心对象, 在编程时,只需要操作

Subject 方法, 底层调用 SecurityManager 方法,无需直接编程操作 SecurityManager
Realm 应用程序和安全数据之间连接器 ,应用程序 进行权限控制读取安全数据(数据表、文件、网路 … ),通过 Realm 对象完成

登录流程: 应用程序 — Subject — SecurityManager — Realm — 安全数据
2.2. Shiro 进行权限控制
四种主要方式 :
1、在程序中 通过 Subject 编程方式进行权限控制
2、配置 Filter 实现 URL 级别粗粒度权限控制 3、 配置代理,基于注解实现细粒度权限控制
4、 在页面中使用 shiro 自定义标签实现 页面显示权限控制
3. 用户登录功能实现
3.1. 配置 shiro 的 Filter 实现 URL 级别权限控制

1、配置 web.xml

2、配置 applicationContext-shiro.xml applicationContext.xml

applicationContext-shiro.xml

配置安全管理器

参考:

anon 未认证可以访问 authc 认证后可以访问 perms 需要特定权限才能访问 roles 需要特定角色才能访问 user 需要特定用户才能访问 port 需要特定端口才能访问 reset 根据指定 HTTP 请求访问才能访问

3.2. 用户登录(认证)功能实现
1、检查 login.html 表单元素 设置 form 的 action

点击立即登录,提交 form 表单

2、编写 UserAction 提供 login 登录方法

了解 Shiro 执行流程, 应用程序 — Subject — SecurityManager — Realm 安全数据

3、自定义 Realm 对象,实现认证方法
自定义 Realm 实现 Realm 接口 (实际开发中,只需要继承 AuthorizingRealm )

将自定义 Realm 注入安全管理器 SecurityManager 当中

DAO 代码

Service 代码

Realm

4、在 user 表插入一些数据

5、在 shiroFilter 配置中将 user_login.action 放行

6、记住当用户名不存在和密码错误时,抛出异常
org.apache.shiro.authc.UnknownAccountException 当认证方法直接返回 null,说明用户名不存在
org.apache.shiro.authc.IncorrectCredentialsException 当返回对象中密码与用户输入密码不一致 密码错误

4. 用户授权功能实现
用户授权功能主要解决 用户能操作哪些功能问题 !
4.1. 对页面部分功能添加权限和角色需要

修改 applicationContext-shiro.xml 配置 shiroFilter 权限过滤程序

访问 courier.html 时,因为需要特别权限 调用 自定义 Realm 的 doGetAuthorizationInfo
进行授权,如果没有权限,跳转

4.2. 在数据表中导入预定义角色、权限数据
导入 t_user_role_permission.sql
权限数据

角色数据

角色 权限 关系表

用户表

用户 角色关系表

4.3. 实现 Realm 的授权方法
Realm

创建角色 Service、DAO

创建权限 Service、DAO

5. Apache Shiro 实现方法级别细粒度权限控制
细粒度(方法)权限控制原因: 自定义注解(加在方法上,在注解中描述需要权限信息),对目标业务对象创建代理对象,在代理方法中使用反射技术读取注解信息,获取需要权限,查询当前登录用户具有权限是否满足

1、配置 applicationContext-shiro.xml 激活注解

传统 spring AOP 配置 , 对 spring bean 创建代理 Advisor ,会在业务 Bean 使用 shiro 注解, 配置自动代理模式 (对所有 spring 管理 bean 的方法,执行时,检查是否有 shiro 注解 )

2、配置快递员添加 方法,业务层使用 shiro 注解

注意问题:

针对 CourierServiceImpl 对象进行代理 !!! 解决:
applicationContext-dataSource.xml

applicationContext-shiro.xml

使用方法注解进行权限控制, 当权限不足时,代理对象抛出一个异常
org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [courier_add]

6. Apache Shiro 实现页面元素显示控制 (了解)
这些标签用于 JSP 页面,控制一些元素是否可见

对这些按钮是否显示进行控制 ,没有权限的用户无法看到对应按钮的

1、在页面引入 shiro 标签库

2、通过 shiro 自带标签控制按钮是否显示

7. Apache Shiro 权限控制(小结)
第一种:URL 级别粗粒度权限控制
配置 web.xml 的 shiroFilter 拦截 /*
在 spring 的 applicationContext*.xml 配置文件中配置同名 bean,配置
filterChainDefinitions 拦截控制规则
xxx.html* = anon (未登录可以访问) xxx.html* =authc (必须登录才能访问 ) xxx.html* = perms[权限] (需要特定权限才能访问) xxx.html* = roles[角色] (需要特定角色才能访问 )

第二种: 方法级别细粒度权限控制
在 spring 的 applicationContext*.xml 配置 spring aop 对 spring 管理 bean 对象开启 shiro 注解支持
@RequiresPermissions(权限) 需要特定权限才能访问
@RequiresRoles(角色) 需要特定角色才能访问
@RequiresAuthentication 需要认证才能访问

第三种:通过 shiro 自定义标签,实现页面元素显示控制
shiro:authenticated 登录后才能访问
<shiro:hasPermission name=“abc”> 需要特定权限才能访问
<shiro:hasRole name=“abc”> 需要特定角色才能访问

第四种:在程序中通过代码 判断用户是否具有指定权限( 不太常用 ,有代码侵入 )

补充: 权限表达式 “:”代表子权限
权限 courier 包含 courier:add、courier:list、courier:* ,如果用户具有父权限,操作
所有子权限功能
权限 courier:list 包含 courier:list:10

标签:控制,ApacheShiro,Realm,入门,框架,访问,Shiro,权限,shiro
来源: https://blog.51cto.com/u_13585440/2707304

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有