Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT RequestFactory:检查是否未经许可设置了成员_Gwt_Requestfactory - Fatal编程技术网

GWT RequestFactory:检查是否未经许可设置了成员

GWT RequestFactory:检查是否未经许可设置了成员,gwt,requestfactory,Gwt,Requestfactory,我正在与GWT/RequestFactory和一组关于权限的客户需求合作。让我来解释一个基本的例子: 每个用户都被分配到一个公司。每个用户都应该能够编辑公司的核心数据,但仅限于联系信息、网站等。只有在用户具有特定权限的情况下,才能更改与安全相关的数据,如BIC/SWIFT、IBAN、公司名称等 到目前为止还不错,在客户端,我可以检查权限并禁用用户不允许编辑的字段。但是,在服务器端,最优雅的方法是什么来确保这些字段未经许可不会被设置 我的问题是我无法跟踪服务器端的更改。对每个setter使用@Pr

我正在与GWT/RequestFactory和一组关于权限的客户需求合作。让我来解释一个基本的例子:

每个用户都被分配到一个公司。每个用户都应该能够编辑公司的核心数据,但仅限于联系信息、网站等。只有在用户具有特定权限的情况下,才能更改与安全相关的数据,如BIC/SWIFT、IBAN、公司名称等

到目前为止还不错,在客户端,我可以检查权限并禁用用户不允许编辑的字段。但是,在服务器端,最优雅的方法是什么来确保这些字段未经许可不会被设置

我的问题是我无法跟踪服务器端的更改。对每个setter使用@PreAuthorize也不是一个选项,因为这将导致每个实体的授权大屠杀

目前,我正在遵循一种变通方法:每个受保护/依赖于给定权限的字段都作为参数传递给entity方法,并从代理中排除。这样,无法使用代理设置值,如果用户有权限,我可以签入服务器代码。如果没有,什么也不会发生。如果用户有权限,我将手动设置这些值。但这会产生大量样板代码和丑陋的方法签名,因为传递给该方法的值的数量可能会很大


我希望你能理解我的问题。我期待着您的意见和提示。先谢谢你

嗯,你可以收到许多答案(彼此不同),而且所有答案都可能是正确的,因此,最后是你的电话。等待别人的回答。我将向您介绍我所遵循的方法(它非常有效):D

在我看来,服务器应该尽可能少做,因此保留允许修改服务器上每个参数的逻辑我认为这不是一个可伸缩的解决方案(如果您的系统有一百万用户同时修改所有内容,您的服务器是否工作流畅?)。我更喜欢让客户来做这项工作(比如Roomba:D)

为了解决这个问题,我们在系统中实现了一个访问控制列表解决方案。您可以在数据库中的每个用户实体上存储一个具有授予权限的列表。因此,当该信息到达客户机时(例如,在用户登录之后),您可以获取这些信息,并显示允许他/她修改的字段

比如:

if (canModifyPersonalDetails(user.getAcls(), ...) ) {
   //show labels ...
}

if (canModifyBankDetails(user.getAcls(), ...) ) {
  //show labels
}
if (isAllowForPersonalDetails(user.getSecurityCode()) {
   //update the modified personal details
}

if (isAllowForBankDetails(user.getSecurityCode()) {
   //update the modified bank details
}

user.update();
您无法避免服务器请求登录,因此发送额外信息并不是什么大问题(想想ACL可以是简单的整数列表0表示个人详细信息,1表示银行详细信息……)

如果您处理的是非常危险的信息,并且您更喜欢在服务器上执行某些操作,在这种情况下,我可能会设置一个安全级别,当您持久化/更新代理时,我会执行以下操作:

if (canModifyPersonalDetails(user.getAcls(), ...) ) {
   //show labels ...
}

if (canModifyBankDetails(user.getAcls(), ...) ) {
  //show labels
}
if (isAllowForPersonalDetails(user.getSecurityCode()) {
   //update the modified personal details
}

if (isAllowForBankDetails(user.getSecurityCode()) {
   //update the modified bank details
}

user.update();
我非常喜欢clear User GUI,也非常喜欢让服务器尽可能地免费,所以我更喜欢第一个选项。但是,如果您有在db中修改用户实体的约束,或者您更喜欢不修改视图,或者任何具有安全性的约束,那么第二个选项可能是最适合您的


希望有帮助

谢谢你迄今为止的回答。如果我正确理解了您的解决方案,您不在服务器端执行任何安全检查吗?我的问题是,我不能信任提交到服务器的客户机数据(通常情况下,您永远不应该如此!)。如果一个请求是用BURP之类的工具伪造的呢?因为您在UI中禁用/隐藏字段,这并不一定意味着这些字段未被编辑。对不起,如果我误解了你!这就是我给你第二个选择的原因。在我的例子中,我的请求并不是很有妥协性,我有一个servlet,它过滤所有内容,再加上另一个安全检查。所以,就我所见,安全性对您来说是一个很大的优势,您对混合解决方案有何看法?如果用户没有权限访问某些字段而不是隐藏,则禁用它们,并在服务器进程中根据级别安全约束编辑字段?这正是我的问题所在:RequestFactory在执行服务器方法之前设置实体的值。因此,无法决定用户是否具有权限,并且取决于是否设置了字段。我所知道的唯一方法是通过检查或例如spring的@PreAuthorize来保护setters。这样,如果用户不能更改值,我会得到一个异常,但我需要用许多权限保护每个setter来处理所有情况。禁用或隐藏用户界面字段并没有任何区别,只是无法防止滥用……您是否将您的实体用作实体代理?我们正在使用ValueProxy,我们可以控制…,如果你在游戏中引入Spring,我会迷路(不是它的粉丝),但就GWT而言,使用ValueProxy,你可以控制实体的更新过程。你是说你没有给定实体的EntityProxy,而是使用ValueProxy?因此,您要从数据库中获取一个实体,将其转换为值对象并将其传递给客户端,反之亦然?是的,我想那会帮我完成工作,但我担心我的老板不会乐意重构数百个实体:)谢谢你的时间!