自动化测试特定区域滑动_自动化用户特定实体的访问控制

自动化测试特定区域滑动

实际上,每个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/333176.shtml

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

相关文章

Linux 命令之 usermod -- 用于修改用户的基本信息

文章目录命令介绍常用选项参考示例设置用户默认使用的shell类型将不能登录的用户改成可以登录的限定用户不能 shell 登录&#xff0c;只能 ftp修改用户的主目录更改用户的名称锁定用户的密码解锁用户的密码将用户添加到指定用户组命令介绍 usermod 命令用于修改用户的基本信息…

使用IDEA的Spring Initializr创建SpringBoot工程

一、创建步骤 二、创建完成后的界面 三、controller package com.william.day01_springboot_initializr.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** author &#xff1…

Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解

文章目录语法格式LOW_PRIORITYCONCURRENTLOCALREPLACE 或 IGNOREPARTITIONCHARACTER SET对导入文件的字段进行格式描述指定行的起始符号和终止符号IGNORE number LINES指定数据表的列名获取表达式的值存储到指定的列中开启/关闭功能参考示例示例一示例二示例三示例四示例五错误…

认证令牌_Java应用程序的简单令牌认证

认证令牌“我喜欢编写身份验证和授权代码。” 〜从来没有Web开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 JSON Web令牌已Swift成为保护Web应用程序安全的标准&#xff0c;并取代了Cook…

SpringBoot配置文件与配置类的属性映射方式

一、在pom文件中加入依赖 目录结构 在实体类中会出现错误&#xff0c;然后点击这个网址会有需要的依赖 网址&#xff1a; https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/configuration-metadata.html#configuration-metadata-annotation-processor 引…

Linux 命令之 groupadd -- 新建用户群组

文章目录命令简介常用选项参考示例创建新的用户组创建系统用户组扩展知识命令简介 用于创建一个新的工作组&#xff0c;新工作组的信息将被添加到 /etc/group 文件中。 /etc/group 文件存储着系统所有的用户组信息&#xff0c;文件中每一行描述一个用户组信息&#xff0c;格式…

java获得电脑性能_Java:使用SingletonStream获得性能

java获得电脑性能仅具有一个元素的Java流有时会在应用程序中造成不必要的开销。 了解如何使用SingletonStream对象并为其中某些流获得十倍的性能&#xff0c;并了解如何同时简化代码。 背景 Java 8中的Stream库是迄今为止Java语言最强大的功能之一。 一旦您开始了解它的多功能…

SpringBoot与MyBatis技术集成

一 、创建project步骤 目录结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…

Linux 命令之 deluser -- 删除用户

文章目录命令简介常用选项参考示例删除普通用户将用户从用户组中删除删除用户的所有文件命令简介 deluser 命令用于删除用户。将一个用户从一个组中删除&#xff08;即退出用户组&#xff09;&#xff0c;大家都推荐用 usermod&#xff0c;其实 deluser 才是正解。deluser 的选…

ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式

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

SpringBoot JPA

一、创建步骤 二、目录结构 三、application.properties配置datasource spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.usernameroot spring.datasource.passwordroot spring.datasource.urljdbc:mysql://localhost/springboot?userUnicod…

Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件

文章目录命令简介常用选项参考示例删除用户命令简介 userdel 命令用于删除指定的用户及与该用户相关的文件&#xff0c;英文全称即“user delete”。在 Debian 上&#xff0c;我们通常会使用 deluser 命令。 其实 userdel 命令实际上是修改了系统的用户账号文件 /etc/passwd、…

RestTemplate入门案例

一、创建步骤注意事项 二、目录结构 三、RestTemplateApplication层 package com.william;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; …

java 示例_功能Java示例 第5部分–将I / O移到外部

java 示例这是称为“ Functional Java by Example”的系列文章的第5部分。 在上一部分中&#xff0c;我们停止了对文档的变异&#xff0c;并返回了数据的副本。 现在&#xff0c;我们需要移走一些I / O。 如果您是第一次来&#xff0c;最好是从头开始阅读。 它有助于了解我们…

Linux 命令之 groupdel -- 删除指定的用户组

命令介绍 groupdel 命令用于删除指定的工作组&#xff0c;本命令要修改的系统文件包括 /ect/group 和 /ect/gshadow。若该群组中仍包括某些用户&#xff0c;则必须先删除这些用户后&#xff0c;方能删除群组。 参考示例 删除指定用户组 删除 linuxcool 工作组&#xff1a; …

模拟微服务业务场景

一、创建步骤 模拟开发过程中的服务间关系。抽象出来&#xff0c;开发中的微服务之间的关系是生产者和消费者关系。 总目标&#xff1a;模拟一个最简单的服务调用场景&#xff0c;场景中保护微服务提供者(Producer)和微服务调用者(Consumer)&#xff0c;方便后面使用微服务架…

Linux 命令之 groupmod -- 更改群组识别码或名称

文章目录命令介绍常用选项参考示例命令介绍 groupmod 命令用于更改群组的识别码或名称时。不过大家还是要注意&#xff0c;用户名不要随意修改&#xff0c;组名和 GID 也不要随意修改&#xff0c;因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名&#xff0c;则建议…

cassandra使用心得_使用Spring Data Cassandra缓存的预备语句

cassandra使用心得今天&#xff0c;我有一篇简短的文章&#xff0c;内容涉及在Spring Data Cassandra中使用Prepared Statements。 Spring为您提供了一些实用程序&#xff0c;使您可以更轻松地使用“预备语句”&#xff0c;而不是依靠自己使用Datastax Java驱动程序手动注册查询…

注册中心 Spring Cloud Eureka

一、搭建eureka-server工程 目录结构 二、导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

Linux 用户(user)和用户组(group)管理概述

文章目录一、理解Linux的单用户多任务&#xff0c;多用户多任务概念二、用户(user&#xff09;和用户组&#xff08;group&#xff09;概念三、用户&#xff08;user&#xff09;和用户组&#xff08;group&#xff09;相关的配置文件、命令或目录一、理解Linux的单用户多任务&…