分享JFInal判断越权操作的简单封装实现思路

1、控制层代码

@Before(MyTemplateValidator.class)
public void update() {
	
	Template template = getModelAndHandlingUltra(Template.class);

	if (template.update()) {
		renderJson(Ret.ok());
	} else {			
		renderJson(Ret.fail());
	}
	
}

public void delete() {
	
	Template template = getModelAndHandlingUltra(Template.class);
	
	template.delete();
	
	redirect("/my/template");
}

2、baseController层

/**
 * 越权处理
 * @param parentIdFieldName 父id字段名(标记数据所属关系)
 * @param idFieldName (数据唯一标识,一般为主键字段名)
 * @param tableName 要更新的数据表名
 * @param idValue 数据唯一标识id值
 */
public void handlingUltra(String parentIdFieldName, String idFieldName, String tableName, Object idValue) {
	Integer parentId = Db.queryInt("select "+parentIdFieldName+" from "+tableName+" where "+idFieldName+"=? limit 1", idValue);
	if (parentId == null || parentId != getLoginAccountId()) {
		throw new RuntimeException("SoJpt提示您: 请别尝试越权操作,否则后果自负!");
	}
}

/**
 * 遵守sojpt数据库设计规范, model表必须有唯一主键id/ID, 不推荐使用多主键
 * @param model 待更新的model
 * @param parentIdFieldName 父id字段名(标记数据所属关系)
 * @return 
 */
public void handlingUltra(Model<?> model, String parentIdFieldName) {
	
	Table table = TableMapping.me().getTable(model.getClass());
	String idFieldName = table.getPrimaryKey()[0];
	
	handlingUltra(parentIdFieldName, idFieldName, table.getName(), model.get(idFieldName));
}

/**
 * 遵守sojpt数据库设计规范, model表必须有唯一主键id/ID, 不推荐使用多主键
 * 默认 parentIdFieldName 为自定义 "account_id"
 * @param model 待更新的model
 * @return 
 */
public void handlingUltra(Model<?> model) {
	
	Table table = TableMapping.me().getTable(model.getClass());
	String idFieldName = table.getPrimaryKey()[0];
	
	handlingUltra("account_id", idFieldName, table.getName(), model.get(idFieldName));
}

public <T> T getModelAndHandlingUltra(Class<T> modelClass) {
	T model = getModel(modelClass);
	handlingUltra((Model<?>) model);
	return model;
}

public <T> T getModelAndHandlingUltra(Class<T> modelClass, String parentIdFieldName) {
	T model = getModel(modelClass);
	handlingUltra((Model<?>) model, parentIdFieldName);
	return model;
}

更多好玩的用法,请前往 sojpt.com 了解 sojpt 脚手架源码

评论区

JFinal

2019-06-01 14:09

这次贴的代码十分工整,base controller 层可以玩出各种便利的功能来

对于绝大部分项目来说 BaseController 是标配。如果你的项目有登录功能,至少需要用来 User getLoginUser()、booloean isLogin()、getLoginUserId() 做这些事

感谢分享

Sohnny

2019-06-01 14:22

@JFinal 发现要先点代码格式在往里沾,才不会乱。这两天在做sojpt官网新功能,顺便就分享我的一些使用技巧

JFinal

2019-06-01 15:26

@Sohnny 分享既助了他人也对自己有益,jfinal 开源出来也是一种分享

1659811173

2019-06-03 17:40

@@JFinal 看不懂,太难了,有没有文档

1659811173

2019-06-03 17:40

@Sohnny 太难了,有没有文档