java-WEB模块物流项目九

更新时间:2024-01-06 12:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

BOS 物流管理系统 第9天 权限系统设计

今天内容安排:

1、 权限控制 几种方式 URL级别 权限控制 (粗粒度权限控制 ) 方法级别 权限控制 (细粒度权限控制 ) 页面中显示的权限控制 ,使用自定义标签 2、 权限系统的数据表设计 3、 Apache Shiro 框架运行原理

4、 shiro 系统集成 (采用Spring 整合shiro 方式集成 )

5、 自定义Shiro Realm ,实现认证功能 (基于数据库完成 )

1.1. 权限系统的数据表如何设计

面试重点!!!

表设计 主要几个实体 : 用户、 角色、 权限 ? 用户 user : 访问系统的人

? 权限 function : 系统某个功能允许访问,对应的权限 (例如: 取派员查询权限、 区

域导入权限 … )

? 角色 role : 角色是权限的一个集合,方便用户授权

一个用户 对应 多个角色 ,一种角色 可以授予多个用户 === 多对多 一个角色 包含 多个权限 ,一个权限 可以属于 多个角色 === 多对多

设计角色表、权限表 都具有 id (编号 生成)、 name (名称 中文)、 code(关键字 编程使用 英文 ) 、description (描述 )

权限表为什么要这么设计 ?

目的为了实现 系统动态菜单 ,添加 菜单的路径、 是否需要生成菜单、 菜单优先级 (保证菜单显示顺序)、 父权限编号 (生成菜单父节点 )

2. 任务二:创建权限数据表、生成实体类

根据PDM 导出SQL 语句

auth_function 权限表

auth_role 角色表

role_function 角色权限关系表 user_role 用户角色关系表

生成实体类,使用hibernate3-maven-plugin 插件 修改 src/main/resources/reveng.xml

替换之前 domain.user下的User实体类

实体类和表设计完成!

3. 任务三:Apache Shiro 权限控制

3.1. Shiro简介

权限控制企业都是采用什么技术开发的 ?

? 自定义权限控制实现 (URL级别 Filter实现、 方法级别 自定义注解 Spring AOP

反射实现, 页面显示 自定义标签实现 ) ? Spring Security 安全框架

缺点:使用复杂、 Spring 官方项目 使用Apache Shiro 进行权限控制 ? Apache Shiro 比较新 ,很多企业了解到shiro 因为 spring side 项目

什么是Apache Shiro ?

Apache Shiro 可以不依赖任何技术使用, 通常在企业中和Spring 结合使用

3.2. 在项目导入shiro

Authentication: 认证 --- 用户登录 Authorization : 授权 ---- 权限管理

项目导入shiro ,使用maven坐标方式 导入

1.2.2 org.apache.shiro shiro-all ${shiro.version}

3.3. Shiro 原理简介

学习shiro ,只需要看规范就ok了 “Apache_Shiro_reference(中文版).pdf” 核心 ;

四大核心内容: 认证、授权、会话管理、 加密

Shiro 是如何进行权限控制的 ?

应用代码 ---- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 ---- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 ----- 安全管理器调用 Realm (程序和安全数据连接器 )

通过以上分析,结论: 程序员使用shiro 只需要 1、 应用程序代码 调用Subject 2、 定义编写Realm连接安全数据

3.4. Shiro 整合BOS 项目,进行URL权限控制

Shiro虽然可以单独使用,但是企业现在使用最多还是 spring + shiro 方式 ! 参考“shiro 安全框架--最好的中文配置文档.pdf”

第一步: URL 级别权限控制, 配置Filter (web.xml )

shiroSecurityFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroSecurityFilter /* 这个Filter 是 spring提供 ,DelegationFilterProxy 是代理Filter (会自动找 和 同名的 对象 )

第二步: 在applicationContext.xml 配置shiro的 Filter 配置shiroFilter后,可以应用 10种过滤规则 配置shiroFilter 其实是一个过滤器链,含有10个Filter

常用规则 : anon 匿名访问 (不需要登录)

authc 认证访问 需要登录

perms 权限控制访问 需要权限 roles 角色控制访问 需要角色

user 用户控制访问 需要特定用户才能访问

/login.jsp = anon /validatecode.jsp = anon /css/** = anon /js/** = anon /images/** = anon /user_login.action = anon /page_base_staff.action = perms[\ 表示访问该资源必须要有staff权限 /page_base_region.action = roles[\ 表示访问该资源必须要有base角色 /** = authc // 必须要登陆可以访问资源

url级别认证管理完成!

完成登陆

3.5. 编写Realm 实现用户身份认证(登录)

? 传统登录逻辑: 用户输入用户名和密码 ---- 传递数据库查询 ---- 返回user ---- 判断如果user不为null, 登录成功, 将user加入session ----- 如果 user为null ,调回登录页面

采用shiro 完成认证代码实现!

? Shiro实现登录逻辑

用户输入用户名和密码 ---- 应用程序调用Subject的login方法 ---- Subject 调用SecurityManager的方法 ---- SecurityManager 调用Realm的认证方法 ---- 认证方法根据登录用户名查询密码 ,返回用户的密码 ---- SecurityManager 比较用户输入的密码和真实密码是否一致

第一步: 修改 UserAction的 login方法

第二步: 需要为SecurityManager 提供 Realm 根据令牌对象数据 方法数据库...

通常自定义Realm 继承 AuthorizingRealm (提供 认证、授权功能 )

BOSRealm 实现认证方法 BOSRealm extends AuthorizingRealm

实现业务方法:

applicationContext.xml 注册 bosrealm 将 realm 给 安全管理器

如果用户名不存在

org.apache.shiro.authc.UnknownAccountException

如果密码错误

org.apache.shiro.authc.IncorrectCredentialsException

国际化信息 配置相关的错误信息

3.6. 用户退出功能

1: index.jsp 页面 添加退出连接

2:action

认证完成!

3.7. 自定义Ream 实现用户授权

授权流程说明

3.7.1. 准备测试数据

applicationContext.xml 添加角色和权限配置

在t_user、auth_role、auth_function、role_function、user_role 无张表 插入一些测试数据 t_user 插入 两个用户

tom rose

auth_function表

auth_role 表

role_function表

user_role

1 号用户 tom 具有 基础设置 base crud 角色

2 号用户 rose 具有 业务受理 取派模块crud 角色

导出 sql tables.sql 下发!!!

3.7.2. 实现Realm 授权代码

Realm代码

超级管理员realm 实现

非超级管理员!

Service 代码 RoleService

FunctionService

DAO 代码

注册 ! 已经完成!

3.8. shiro 注解实现方法级别的权限控制

方法级别权限控制 原理

1、 自定义注解

2、 Spring AOP 代理 3、 反射获取注解信息

第一步: 配置applicationContext.xml

第二步: 在需要控制权限目标方法上,使用shiro的注解

? @ RequiresRoles 需要角色

? @RequiresPermissions 需要权限

例一: Action对象方法级别的控制 例如添加分区/取派员操作

错误:

java.lang.NoSuchMethodException: $Proxy117.pageQuery()

原因: Spring 代理优先对接口代理 Action 接口 只有execute方法,没有 pageQuery 方法 解决: 配置 applicationContext.xml 对目标类代理

测试

错误2:

Caused by: java.lang.ClassCastException: cannot

be

cast

to

java.lang.Class

java.lang.reflect.ParameterizedType

原因:参数泛型序列化问题

解决: 修改BaseAction 构造器 对代理类的父类型(StaffAction) 获取参数化泛型

问题3:action 注入的业务层接口实例null指针

java.lang.NullPointerException Service 无法注入

解决方案1: 配置struts2 文件

struts.objectFactory这个属性用于说明Struts2的对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Spring中的对象池,当想要得到Spring中的对象池时,申明struts.objectFactory为Spring的对象池构建工厂。当指定struts.objectFactory为spring时,struts2框架就会把bean转发给spring来创建,装配,注入。但是bean创建完成之后,还是由struts容器来管理其生命周期。 在struts.xml中的代码如下:

struts.objectFactory.spring.autoWire是用spring插件通过覆盖(override)Struts2的 ObjectFactory来增强核心框架对象的创建。 当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,

如果能找到则由Spring创建,否则由Struts2框架自身创建,然后由Spring来装配。

解决2: 采用setter方法注入,对业务层对象设置名称 不推荐!

Action 添加shiro 注解完成!\\

补充 对于方法级别权限控制 如果登陆用户 没有角色或者权限 报 500错误! 一般提供友好页面

1: struts2 异常处理机制

struts.xml 配置异常处理 类型以及结果集

2: 配置全局结果集

3: 编写错误页面 获取异常信息 源码:

获取异常信息 标签如下

4: applicationContext.xml

2: web.xml 配置500错误 配置具体异常类型..

问题4: 业务层添加权限注解 注解无效!

不行的 ! 但是没有异常 用户没有权限角色 也可以 执行该方法! 也就是 shiro 注解无效!

applicationContext.xml 配置事务管理器 面向实现类做代理

Shiro URL级别控制和注解控制 ,没有权限处理效果

不一样

URL 控制,没有权限 ,页面自动跳转unauthorizedUrl

方法注解 权限控制, 没有权限,直接抛出org.apache.shiro.authz.AuthorizationException

如果登陆用户没有该权限

一般页面对应功能标签不需要显示!

3.9. shiro 标签库的使用说明

举例: staff.jsp 页面 引入shiro 标签库

在指定标签 添加角色或者权限

登陆用户如果有base角色就会显示该标签!

小结:

1、 权限控制的几种方式 ? 实现原理? URL 、 方法注解、 页面显示标签控制 2、 画出 权限控制数据表结构

3、 Shiro权限控制好处, 为什么要使用Apache Shiro ?

使用简单,灵活 数据可以采用自定义Realm 连接安全数据 (没有数据来源要求 , 来自文件、 数据库、网络 … ) 4、 Shiro 运行原理

应用代码 ---- Subject --- SecurityManager ----- Realm 5、 自定义Realm 实现 用户认证和授权 6、 Spring 整合 Shiro 进行 URL级别权限控制和方法级别 权限控制 7、 画图 整理 shiro 认证和授权,调用过程

SQL和HQL (JPQL )多表查询 SQL : select … from 表A inner join / left outer join 表B on A.xx = B.xx where 条件 HQL(JPQL):只需要记忆 迫切连接查询(带fetch) from 类A 别名a inner join fetch / left outer join fetch a.属性 别名b where a.属性=? and b.属性=?

本文来源:https://www.bwwdw.com/article/xmgx.html

Top