自动化用户特定实体的访问控制

实际上,每个Web应用程序都应该有多个用户,每个用户都有一些数据-帖子,文档,消息等等。 最明显的事情是保护这些实体免遭非这些资源合法所有者的用户获取。

不幸的是,这不是最容易的事情。 我并不是说很难,它不像简单地返回资源那样直观。 当您是/record/{recordId}端点时,您将立即执行对recordId的数据库查询。 只有这样,才需要检查此记录是否属于当前经过身份验证的用户。

框架在这里没有帮助,因为这种访问控制和所有权逻辑是特定于域的。 没有明显的通用方法来定义所有权。 它取决于实体模型和实体之间的关系。 在某些情况下,它可能非常复杂,需要在联接表中查找(对于多对多关系)。

但是您应该自动执行此操作,原因有两个。 首先,在每个端点/控制器方法上手动执行这些检查很繁琐,并且使代码难看。 其次,更容易忘记添加这些检查,尤其是在有新开发人员的情况下。

您可以在DAO的所有地方进行这些检查,但通常应尽早失败,因此这些检查应在控制器(端点处理程序)级别上进行。 对于Java和Spring,可以使用批注和HandlerInterceptor来自动执行此操作。 在使用任何其他语言或框架的情况下,也可以使用类似的方法-一种可插拔的方式来描述要检查的所有权关系。

以下是放置在每个控制器方法上的示例注释:

public @interface VerifyEntityOwnership {String entityIdParam() default "id";Class<?> entityType();
}

然后定义拦截器(当然,应将其配置为执行)

@Component
public class VerifyEntityOwnershipInterceptor extends HandlerInterceptorAdapter {private static final Logger logger = LoggerFactory.getLogger(VerifyEntityOwnershipInterceptor.class);@Autowiredprivate OrganizationService organizationService;@Autowiredprivate MessageService MessageService;@Autowiredprivate UserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();// assuming spring-security with a custom authentication token typeif (authentication instanceof ApiAuthenticationToken) {AuthenticationData authenticationData = ((ApiAuthenticationToken) authentication).getAuthenticationData();UUID clientId = authenticationData.getClientId();HandlerMethod handlerMethod = (HandlerMethod) handler;VerifyEntityOwnership annotation = handlerMethod.getMethodAnnotation(VerifyEntityOwnership.class);if (annotation == null) {logger.warn("No VerifyEntityOwnership annotation found on method {}", handlerMethod.getMethod().getName());return true;}String entityId = getParam(request, annotation.entityIdParam());if (entityId != null) {if (annotation.entityType() == User.class) {User user = userService.get(entityId);if (!user.getClientId().equals(clientId)) {return false;}} else if (annotation.entityType() == Message.class) {Message record = messageService.get(entityId);if (!message.getClientId().equals(clientId) {return false;}} // .... more}}return true;}@SuppressWarnings("unchecked")private String getParam(HttpServletRequest request, String paramName) {String value = request.getParameter(paramName);if (value != null) {return value;}Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);return pathVariables.get(paramName);}
}

您会看到这假定每种类型都需要自定义逻辑。 如果您的模型很简单,则可以使之通用–使所有实体都使用它们都定义的getClientId()方法实现某些Owned接口。 然后只需要一个dao.get(id, entityClass); 并避免使用特定于实体的逻辑。

请注意,当方法上没有注释时,将显示警告-那里表示您可能已经忘记添加一个。 某些端点可能不需要所有权检查-对于它们,您可以具有特殊的@IgnoreEntityOwnership批注。 关键是要做出有意识的决定,以不验证所有权,而不是忘记所有权并引入安全问题。

我的意思可能很明显。 但是我已经看到了许多这种遗漏的例子,包括生产政府项目。 正如我说的,框架不会强迫您考虑这一方面,因为它们不能以通用的方式做到这一点– Web框架通常与您的实体模型无关,而ORM与您的控制器无关。 有处理所有这些方面的综合框架,但是即使它们没有通用的机制 (至少我不知道)。

安全性包括对系统应用一套良好的实践和原则。 但是,它还包括一些程序和自动化程序,这些程序和自动化程序可以帮助开发人员和管理员不要忽略他们通常知道的东西,而会时不时地忘记。 而且,应用安全性原则越乏味,则一贯应用安全性原则的可能性就越大。

翻译自: https://www.javacodegeeks.com/2018/10/automate-access-control-user-entities.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlserver安装显示句柄无效_Sqlserver 2016 R Service环境安装的各种错误(坑)解决办法...

相信很多朋友都会慕名Sqlserver 2016的R语言功能&#xff0c;将自己的数据库升级到Sqlserver 2016&#xff0c;但是当你安装完Sqlserver 2016的R语言组件之后&#xff0c;你会发现并不能直接使用&#xff0c;比如当你在SSMS中执行下面这段测试R语言命令的时候&#xff0c;Sqlse…

oracle用一个字段往上递归,深入sql oracle递归查询

获取数据库所有表名&#xff0c;表的所有列名 select name from sysobjects where xtypeuselect name from syscolumns where id(select max(id) from sysobjects where xtypeu and name表名)查询数据sql语句里的递归查询 sqlServer2005和Oracle 两个版本以前使用Oracle&#x…

如何在Spring Boot App中集成H2数据库

你好朋友&#xff0c; 在本教程中&#xff0c;我们将尝试探索如何在Spring Boot应用程序中与H2数据库集成。 在进行检查之前&#xff0c;让我们了解有关H2数据库的一些基础知识&#xff0c;如下所述&#xff0c;然后我们将讨论H2数据库与Spring Boot的集成。 什么是H2数据库…

python在路径里添加变量_想学Python?那就先从头开始吧!

作为人工智能和大数据时代最具竞争力的 Python 语言&#xff0c;越来越多的出现在各大编程热搜排行榜上。首先你要了解什么是python了解Python语言Python是一种解释型, 面向对象, 动态数据类型的高级程序设计语言.Python由Guido van Rossum&#xff08;荷兰&#xff09; 于1989…

php生成16位不重复随机码,PHP n个不重复的随机数生成代码

复制代码代码如下://range是将1到100列成一个数组$numbersrange(1,100);//shuffle将数组顺序随即打乱shuffle($numbers);//array_slice取该数组中的某一段$no6;$resultarray_slice($numbers,0,$no);for($i0;$iecho$result[$i]."";}print_r($result);?>复制代码代…

ant 走马灯面板指示显示不出来_触摸屏报警信息显示设置方法

人机界面(HMI)是自动化设备中非常常用的器件&#xff0c;用于替代操作面板上的实体按钮或者显示指示。人机界面的适用极大的减小了设备操作面板的尺寸&#xff0c;提升了设备的整体美观度。随着自动化设备的自动化程度的提高&#xff0c;也对设备的报警信息提出了更高的要求。如…

oracle bbed 使用,Oracle BBED使用 四步快速启动Oracle BBED

Oracle BBED使用&#xff0c;四步快速启动Oracle BBED&#xff0c;环境&#xff1a;Oracle 10g RHEL 5.8&#xff0c;介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Oracle blo环境&#xff1a;Oracle 10g RHEL 5.8介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Or…

python打包加版本信息_使用pyi-set_version为PyInstaller打包出来的程序附加版本信息...

本文将讲述如何使用 pyi-grab_version获取版本信息的模板文件&#xff0c;以及使用 pyi-set_version为打包好的程序附加版本信息。当然了&#xff0c;在开始前&#xff0c;需要你已经安装好了 PyInstaller 这个工具。如果已经安装&#xff0c;你可以在 Python 的安装目录&#…

linux读取.data文件,[20121227]v$datafile访问是从数据文件获取信息吗.txt

[20121227]v$datafile访问是从数据文件获取信息吗.txt记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件.虽然当时对方并没有告诉答案,显然认为水平不再同一档次上.直到有一次看一篇blog:SELECT controlfile "SCN location"…

java 常见错误_Java常见错误的十大列表(前100名!)

java 常见错误前10名名单非常受欢迎&#xff0c;有趣且内容丰富。 但是有很多&#xff01; 如何选择合适的&#xff1f; 这是一个元前10名列表&#xff0c;可帮助您找到前10名的前10名列表。 在更令人讨厌的笔记上&#xff1a; SELECT TOP 10 mistake FROM source1 UNION ALL …

dll侧加载_win7系统开机提示xxxdll模块已加载但找不到入口点的解决方法

很多小伙伴都遇到过win7系统开机提示xxxdll模块已加载但找不到入口点的困惑吧&#xff0c;一些朋友看过网上零散的win7系统开机提示xxxdll模块已加载但找不到入口点的处理方法&#xff0c;并没有完完全全明白win7系统开机提示xxxdll模块已加载但找不到入口点是如何解决的&#…

linux md5加密文件,Linux下对字符串进行MD5加密

深入学习golang&lpar;1&rpar;—数组与切片数据(array)与切片(slice) 数组声明: ArrayType "[" ArrayLength "]" ElementType . 例如: va ...使用apt-fast 来加速你的Ubuntu 的apt使用apt-fast 来加速你的Ubuntu 的apt sudo add-apt-repository …

JDK 12:实际中的切换语句/表达式

我的上一篇文章“ 玩JDK 12的Switch表达式 ”讨论了如何使用JDK 12 Early Access Builds尝试JEP 325 switch 表达式和语句&#xff0c;并提供了一个简单的示例。 这篇文章使用相同的JDK 12 Early Access Build 10来演示switch表达式和增强的switch语句的不同功能。 我在博客文…

broker可以禁用吗 time_Win8.1系统Runtime Broker是什么进程?可以禁用吗?

我们知道电脑一开启就有很多进程了&#xff0c;其中有一个Runtime Broker是大家比较疑惑的&#xff0c;很多人会问Win8.1系统Runtime Broker是什么进程&#xff1f;可以禁用吗&#xff1f;带着这两个问题&#xff0c;小编现在就来为大家讲解一下。一、RuntimeBroker进程介绍Run…

2. linux的日志文件在哪个目录,位于/var/log目录下的20个Linux日志文件

如果你多数时间都在使用Linux系统&#xff0c;那么你有必要知道系统的日志文件位于哪里&#xff0c;以及每个日志文件是关于哪些内容的。在系统正常的时候学习理解各种日志文件的内容&#xff0c;有助于在遇到紧急情况时通过日志文件定位问题所在。/etc/rsyslog.conf文件决定了…

linux内核4.4和4.5,[图]Linux Kernel 4.5系列第4个维护版本发布

Greg Kroah-Hartman表示&#xff1a;“我今天宣布了Linux 4.5.4内核&#xff0c;所有Linux 4.5内核系列用户必须尽快升级。已经升级的4.5.y git tree能够在git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.5.y中获取&#xff0c;也能通过访问h…

python字符串下标截取_python 用下标截取字符串的实例

python 用下标截取字符串的实例运行环境&#xff1a; win7 64位python 2.7pycharmpython 源码如下# -*- coding: utf-8 -*-str 0123456789print(str[0:3])print(str[0:-1])print(str[-1])print(str[2:5])print(str[6:-1])print(str[6:])运行效果如下&#xff1a;0120123456789…

linux正则表达式脚本实例,PowerShell中正则表达式使用例子

本文介绍PowerShell中正则表达式的使用&#xff0c;PowerShell的正则表达式与微软其它语言的正则表达式是一样的&#xff0c;使用非常方便。正则表达式本身是怎么回事&#xff0c;本文不做讨论&#xff0c;反正PowerShell还是用的微软的那一套正则表达式规则&#xff0c;学VB、…

天津python招聘信息网_【天津-滨海新区Python招聘_最新热搜天津-滨海新区Python人才招聘信息】-前程无忧...

学历要求&#xff1a;硕士|工作经验&#xff1a;3-4年|公司性质&#xff1a;上市公司|公司规模&#xff1a;150-500人专业&#xff1a;计算机、自动化、软件工程、图形图像学或相关专业 语言&#xff1a;c c c# java 数据库 算法 工作经验&#xff1a;3年以上 岗位专业能力&…

前端---初始常用的 html 标签

1. 常用的 html 标签 <!-- 1、成对出现的标签&#xff1a;--><h1>h1标题</h1> <div>这是一个div标签</div> <p>这个一个段落标签</p><!-- 2、单个出现的标签&#xff1a; --> <br> <img src"images/pic.jpg&qu…