java – JOOQ中的行级安全性实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JOOQ中的行级安全性实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2312字,纯文字阅读大概需要4分钟。
内容图文
![java – JOOQ中的行级安全性实现](/upload/InfoBanner/zyjiaocheng/705/d6083dcb19a54c40b52f3185b5e7ccf4.jpg)
我想使用JOOQ库在Java中实现oracle行级安全类功能
这是一个示例JOOQ查询代码:
Result<Record> result = dslContext.select().from(Employee.EMPLOYEE).fetch();
上面的代码将生成如下SQL:
select [dbo].[Employee].Id,... from [dbo].[Employee]
我想添加一个where子句来过滤特定于用户安全性的数据,如下所示:
select [dbo].[Employee].Id,... from [dbo].[Employee] WHERE [dbo].[Employee].Security IN (1,2)
解决方法:
明确的谓词
除非我遗漏了一些不错的SQL Server功能,其中行/记录包含一个名为.Security的伪列来实现行级安全性,你应该能够简单地写
dslContext.select()
.from(EMPLOYEE)
.where(EMPLOYEE.SECURITY.in(1, 2))
.fetch();
有关jOOQ谓词构建的更多信息,请参阅此处的手册:
> http://www.jooq.org/doc/latest/manual/sql-building/conditional-expressions
特别是IN谓词:
> http://www.jooq.org/doc/latest/manual/sql-building/conditional-expressions/in-predicate
使用jOOQ的ExecuteListener的一般解决方案
根据您的意见,无论特定程序员输入什么,您都在寻找一种通过附加谓词修补所有SQL语句的通用方法.
您可以使用jOOQ执行此操作,但请注意,如果程序员绕过jOOQ,这只会帮助您强制执行谓词,而不是保证它.您可以做的是设置ExecuteListener,拦截renderStart()事件以修补/替换正在执行的查询.这些方面的东西:
@Override
public void renderStart(ExecuteContext ctx) {
if (ctx.query() instanceof Select) {
// Operate on jOOQ's internal query model
SelectQuery<?> select = null;
// Check if the query was constructed using the "model" API
if (ctx.query() instanceof SelectQuery) {
select = (SelectQuery<?>) ctx.query();
}
// Check if the query was constructed using the DSL API
else if (ctx.query() instanceof SelectFinalStep) {
select = ((SelectFinalStep<?>) ctx.query()).getQuery();
}
if (select != null) {
// Use a more appropriate predicate expression
// to form more generic predicates which work on all tables
select.addConditions(EMPLOYEE.SECURITY.in(1, 2));
}
}
}
当然,上面还有改进的余地.欢迎在user group上讨论用例
使用jOOQ的VisitListener的一般解决方案
如果您愿意深入了解jOOQ的内部,那么您也可以尝试实现VisitListener并实际转换jOOQ的AST查询表示.这在此处记录:
> http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-sql-transformation/
使用视图的一般解决方
虽然上面的工作,我个人建议您使用视图,并隐藏开发人员的实际表.例:
CREATE VIEW v_employee AS
SELECT a, b, c, ...
FROM t_employee
WHERE t_employee.security in (1, 2)
通过适当的授权,您可以隐藏开发人员的表格,确保他们只使用所需谓词的视图始终到位
内容总结
以上是互联网集市为您收集整理的java – JOOQ中的行级安全性实现全部内容,希望文章能够帮你解决java – JOOQ中的行级安全性实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。