实际上,每个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

自动化用户特定实体的访问控制相关推荐

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

    自动化测试特定区域滑动 实际上,每个Web应用程序都应该有多个用户,并且每个用户都有一些数据-帖子,文档,消息等等. 最明显的事情是保护这些实体免遭非这些资源合法所有者的用户获取. 不幸的是,这不是最 ...

  2. 使用用户行为实体分析和数据可视化的异常检测

    Anomaly Detection using User Entity Behavior Analytics and Data Vsualization 使用用户行为实体分析和数据可视化的异常检测 1 ...

  3. 用户与实体行为分析在实时网络攻击检测中的角色

    The role of User Entity Behavior Analytics to detect network attacks in real time 用户与实体行为分析在实时网络攻击检测 ...

  4. 企业安全中的用户与实体行为分析

    User and Entity Behavior Analytics for Enterprise Security 企业安全中的用户与实体行为分析 期刊/会议:2016 IEEE Internati ...

  5. Linux创建指定用户特定指定目录权限

    指定用户特定指定目录权限 需要注意要指定好文件夹的权限,不然会导致nginx不能访问,最好是在root下建立目录,然后 # useradd -d /usr/www -m tempuser # pass ...

  6. LTE下行用户特定参考信号

    1. 简介 LTE下行用户特定参考信号(UE-specific Reference Signal),又称解调参考信号(DeModulation Reference Signal,DMRS).所谓&qu ...

  7. android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

    数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制. MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据 ...

  8. mysql revoke数据库_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

    数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制. MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据 ...

  9. linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限

    Linux添加FTP用户并设置权限 在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户: ...

最新文章

  1. 27年前被Nature拒稿,如今斩获诺贝尔奖!学术投稿模式再引热议:都有神奇的评审2...
  2. Java面试题:如何将字符串反转?(翻转字符串)
  3. leetcode 1818. 绝对差值和
  4. MySQL checkpoint机制详解
  5. 站点页面Service Unavailable 503的一种解决方法
  6. 富文本编辑器中空格转化为a_文本编辑器题解
  7. python下载安装-Python下载安装
  8. 速读-对抗攻击的弹性异构DNN加速器体系结构
  9. CAD异常eNotOpenForWrite
  10. 树莓派远程监控+运动目标检测
  11. Gauss-Newton法matlab求解
  12. 网站2008服务器32位好还是64位好,win server 2008 32位与64位区别
  13. 世界主要经济体历年GDP排名一览(前50强)
  14. docker 更改阿里云镜像
  15. win系统cpu温度获取
  16. PE中Ghost 使用详解
  17. STM32输入捕获原理与配置
  18. 影像质量评估之锐利度--MTF(SFR)
  19. 阿里云下Redis集群报Waiting for the cluster to join...和CLUSTERDOWN Hash slot not served的坑(网上搜了好多没看到什么能基本解决的)
  20. 关于VS中的sln文件

热门文章

  1. Java多线程:线程安全和非线程安全的集合对象
  2. Java 中的双重检查(Double-Check)
  3. Windows访问Linux的Tomcat,显示无法连接
  4. 今天 ,给大家变个魔术!!!
  5. hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
  6. 2016经典微小说:《轮回》
  7. 2020蓝桥杯省赛---java---B---4( 合并检测)
  8. HashSet的存储方式
  9. bs架构 erp 进销存_从应用架构看生鲜电商信息化建设
  10. android roboguice2,Android快速开发框架 roboguice