efw框架登录与权限控制示例
示例概述
这是一个基于efw框架的Web应用程序示例,演示了完整的登录控制和权限控制功能。该示例适用于企业内部或面向互联网的Web应用,提供了纵深防御安全体系,有效防止URL直接访问和开发者工具恶意调用。
功能特性
登录控制
- 登录检查机制:自动验证用户登录状态
- 会话超时处理:自动跳转到登录页面
- 免登录页面:登录页、密码找回页、密码修改页、错误页
- 双重安全防护:前端组件标签防护 + 后端会话验证
权限控制
- 角色管理:管理员和普通用户两种角色
- 细粒度控制:基于URL和事件ID的访问控制
- 安全错误处理:对越权访问显示系统错误页面
- 多层权限验证:前端界面控制 + 后端权限检查
安全架构:纵深防御体系
前端安全防护
通过<efw:client>标签机制防止组件被直接调用:
防护原理:
- 组件页面(子画面、对话框)不包含
<efw:client>标签 - 只有通过主页面正确加载的组件才能正常执行功能
- 直接访问组件页面时,所有JavaScript事件函数无法执行
安全效果:
直接访问:http://app.com/MST01_inputdialog.jsp
→ 页面能打开,但所有功能失效
正确访问:通过主页面对话框打开 → 功能正常工作
后端安全验证
服务器端会话和权限检查作为终极防线:
会话验证机制:
- 每个请求都验证会话中是否存在有效的USER_ID
- 未登录或会话过期自动重定向到登录页面
- 会话数据存储在服务器端,客户端无法篡改
权限检查机制:
- 基于用户角色(管理员/普通用户)的细粒度控制
- 验证当前操作是否在用户权限范围内
- 越权访问直接返回错误页面
防护效果:
// 黑客尝试在开发者工具中伪造请求
fetch('/app/event', {
method: 'POST',
body: 'eventId=MST01_delete&userId=123'
});
→ 后端验证用户权限 → 权限不足 → 返回错误页面
项目结构
skeletonSample/
├── JSP页面文件/
│ ├── LG01.jsp # 登录页面
│ ├── LG02.jsp # 菜单页面
│ ├── LG03.jsp # 密码找回页面
│ ├── LG04.jsp # 密码修改页面
│ ├── MST01.jsp # 用户管理主页面
│ ├── error.jsp # 错误页面
│ └── 组件文件...
├── JavaScript事件文件/
│ ├── LG01_*.js # 登录相关事件
│ ├── LG02_*.js # 菜单相关事件
│ ├── MST01_*.js # 用户管理事件
│ └── 全局事件文件...
├── 配置文件/
│ └── efw.properties # 框架配置文件
└── 数据库文件/
├── skeletonSample.backup # PostgreSQL备份文件
└── ユーザマスタDDL.sql # 用户表创建脚本
核心配置
登录控制配置 (efw.properties)
# 启用登录控制
efw.login.check = true
efw.login.key = USER_ID
efw.login.url = LG01.jsp
# 免登录页面模式
efw.outoflogin.url.pattern = LG01|LG03|LG04.jsp
efw.outoflogin.eventid.pattern = LG01|LG03|LG04|head_logout
权限控制配置 (efw.properties)
# 启用权限控制
efw.auth.check = true
efw.auth.key = USER_ID
efw.system.error.url = error.jsp
# 角色定义
efw.auth.cases = admin,user
# 管理员权限
admin.auth.pattern = ^admin.*$
admin.url.pattern = LG02|MST01.jsp
admin.eventid.pattern = LG02|MST01
# 普通用户权限
user.auth.pattern = ^((?!admin).)*$
user.url.pattern = LG02.jsp
user.eventid.pattern = LG02
安全特性详解
1. 前端组件防护机制
- 技术实现:通过
<efw:client>标签注册前端可执行函数 - 防护范围:防止直接URL访问组件页面
- 优势:轻量级防护,提升用户体验
2. 后端会话验证
- 技术实现:服务器端会话状态检查
- 防护范围:所有HTTP请求(页面访问、事件调用、API请求)
- 优势:无法被前端绕过,安全性极高
3. 权限验证流程
用户请求 → 前端组件验证 → 后端会话验证 → 后端权限验证 → 业务执行
4. 错误处理策略
- 正常操作:友好的用户界面提示
- 异常访问:统一的系统错误页面
- 安全原则:对潜在攻击者不提供详细信息
数据库设计
用户主表结构:
CREATE TABLE "ユーザマスタ" (
"ユーザID" VARCHAR(10) NOT NULL PRIMARY KEY, -- 用户ID
"パスワード" VARCHAR(10), -- 密码
"ユーザ名" VARCHAR(20), -- 用户名
"メール" VARCHAR(50), -- 邮箱
"コメント" VARCHAR(200), -- 备注
"初期化フラグ" INTEGER, -- 初始化标志
"ロックフラグ" INTEGER, -- 锁定标志
"パスワード更新日" DATE, -- 密码更新日期
"作成日時" DATE, -- 创建时间
"作成者" VARCHAR(10), -- 创建者
"更新日時" DATE, -- 更新时间
"更新者" VARCHAR(10) -- 更新者
);
运行要求
- 数据库:PostgreSQL(推荐)或其他支持数据库
- Web服务器:支持JSP的Servlet容器
- 依赖组件:数据库驱动、邮件组件、POI组件
快速开始
- 恢复数据库备份或执行提供的SQL脚本
- 配置数据库连接参数
- 部署到Web服务器
- 访问登录页面开始使用
安全最佳实践
- 会话管理:设置合理的会话超时时间
- 密码策略:实现强密码要求和定期更换
- 错误处理:统一的错误页面避免信息泄露
- 日志记录:记录重要的安全事件
- 定期审计:审查权限配置和用户角色
这个示例展示了efw框架在企业级Web应用中的完整安全解决方案,通过前端防护 + 后端验证的纵深防御体系,为Web应用提供了企业级的安全保障。