【分享】自定义用户管理的简单实现
王多多 发布于86月前 2答/5786阅

EOVA平台默认“用户管理”菜单的主表为:eova数据源的eova_user表,保存登录账号、登录密码等信息


如果你是从其它系统迁移到EOVA平台,有自己的用户表,或者就是不想用eova_user表,可以自定义用户管理、自定义登录验证


思路:

1.创建或使用自己的用户表,导入元数据

2.在com.oss.OSSController类中覆盖父类的doLogin()方法

3.实现登录验证逻辑

4.构建会话eova_user对象,桥接属性

5.仍由EOVA框架根据虚拟eova_user对象进行登录初始化


相应实现:

1.在main数据源(即默认数据源)中创建一个“通讯录”表:

CREATE TABLE `contacts` (
`mobilephone` varchar(11) NOT NULL COMMENT '手机号码' ,
`login_pwd` varchar(30) NOT NULL COMMENT '登录密码' ,
`nickname` varchar(50) COMMENT '昵称' ,
`address` varchar(200) COMMENT '地址' ,
`rid` int(11) NOT NULL COMMENT '角色编号' ,
PRIMARY KEY (`mobilephone`)
);

计划通过此表的手机号码+登录密码,登录EOVA平台

注意必须存在“角色编号”字段,即eova_role表的外键,否则EOVA无法进行权限管理,也就无法登录

这里故意将mobilephone字段作为主键,模拟主键设置不当,凸显后面会遇到的问题。大家尽量使用自增ID作为主键,可以避免一些麻烦。


导入元数据(在新标签页中打开图片或下载可看大图):


角色编号下拉框表达式:select id ID,name CN from eova_role where lv > ${user.role.lv};ds=eova


增加菜单:



此时已完成对“通讯录”表的增删改查功能:



2-5. (思路中第二至第五步) 请详看代码和注释:

package com.oss;

import com.eova.common.utils.xx;
import com.eova.config.EovaConfig;
import com.eova.config.EovaConst;
import com.eova.core.IndexController;
import com.eova.model.User;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

/**
 * 本类是com.oss.OSSConfig中配置的JFinal访问路由根路径(/)控制器
 * 其父类IndexController中提供了EOVA平台登录、修改密码等内建功能的默认实现
 * 如需修改默认实现逻辑,在本类中覆盖父类方法即可
 * @version base eova 1.6
 * @author Jieven
 * @editor 多多
 */
public class OSSController extends IndexController {

	@Override
	public void doLogin() {
		// 获取请求参数
		String loginId = getPara("loginId");
		String loginPwd = getPara("loginPwd");

		// 验证码验证
		boolean isCaptcha = xx.toBoolean(EovaConfig.getProps().get("isCaptcha"), true);
		if (isCaptcha && !super.validateCaptcha("captcha")) {
			setAttr("msg", "验证码错误,请重新输入!");
			toLogin();
			return;
		}

		// 根据登录名从自定义用户表中查询用户,我这张表的主键是mobilephone
		Record user = Db.findById("contacts", "mobilephone", loginId);
		
		// 用户密码验证
		if (user == null) {
			setAttr("msg", "手机号不存在");
			toLogin();
			return;
		}
		if (!user.getStr("login_pwd").equals(loginPwd)) {
			setAttr("msg", "密码错误");
			keepPara("loginId");
			toLogin();
			return;
		}
		
		// 关键来了:构建会话eova_user对象,桥接属性
		// rid:EOVA内建权限管理的角色编号,贯穿很多功能的使用,必须要有,int类型
		// login_id:header.html中会用到,就是登录成功后右上角的欢迎[xxx]
		// id:记录到系统日志中的操作用户标识,如果不设置则新增、修改等操作会报错,必须是int类型
		// 使用业务字段作为主键的人这里就懵逼了,比如我,自定义用户表的主键是11位手机号,超出int数值范围
		// 无奈截取后8位作为操作用户标识,这是不严谨的,建议大家尽量使用自增、序列等非业务数据作为主键
		// 如果非要使用业务字段作为主键,方案:
		// 1.不要求"系统日志"功能的准确性,那id这个属性值你随意填
		// 2.增加一个int类型字段,与主键1对1关系,值为自增长,作为id属性值
		User sessionUser = new User();
		sessionUser.put("rid", user.getInt("rid"));
		sessionUser.put("login_id", loginId);
		sessionUser.put("id", Integer.valueOf(loginId.substring(3)));
		sessionUser.init();// 内部构建用户角色属性,根据rid

		try {
			// 由父类根据虚拟eova_user对象进行登录初始化
			// 也就是仍使用EOVA平台内建的权限管理
			loginInit(this, sessionUser);
		} catch (Exception e) {
			e.printStackTrace();
			setAttr("msg", e.getMessage());
			keepPara("loginId");
			toLogin();
			return;
		}

		// 同样关键,将虚拟eova_user对象放入会话,对该属性的使用者来说,没有任何影响,目的达到
		setSessionAttr(EovaConst.USER, sessionUser);

		// 重定向到首页
		redirect("/");
	}

	@Override
	public void updatePwd() {
		// TODO 请参见源码自行实现,否则页面右上角"修改密码"功能无法正常使用
	}
}


通过SQL添加超级管理员(角色编号为1):

INSERT INTO `contacts` (`mobilephone`, `login_pwd`, `nickname`, `address`, `rid`) VALUES ('18612345678', '888888', '多多', '莲花乡池水沟子', 1);


使用“通讯录”表中的用户登录成功!



“修改密码”功能还需覆盖updatePwd方法做相应改变,其它菜单和功能均可正常使用,

“系统日志”菜单中“操作用户”字段查找框表达式也要做相应改变,完。

水平有限,请多指教。


[沙发] Jieven
666,坐等加精,先标记一下!!!!
[地板] 股往金来
这里面有几个坑,各位要注意一下。
提交评论
嘿,我来帮你!