Salesforce:使用SOQL来加强安全性和限制记录访问是一个好主意吗?

Salesforce:使用SOQL来加强安全性和限制记录访问是一个好主意吗?,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,这更像是一个最佳实践问题。我们的组织目前对自定义对象的组织范围默认设置具有“公共读取”权限。我们不能将其私有化,因为它现在对内部员工的工作方式,或者更确切地说,我们正试图避免这种情况 我还创建了一个客户门户网站,其中包含定制的可视强制页面……在这里,我使用SOQL查询显示数据 在SOQL查询中添加一个子句,只返回帐户id与登录用户的帐户id匹配的记录,这是一个好主意吗 我做到了,而且效果很好……但是这种方法有没有我忽略的陷阱 谢谢, 卡尔文 因为标准控制器在用户模式下执行,其中 当前服务器的权限

这更像是一个最佳实践问题。我们的组织目前对自定义对象的组织范围默认设置具有“公共读取”权限。我们不能将其私有化,因为它现在对内部员工的工作方式,或者更确切地说,我们正试图避免这种情况

我还创建了一个客户门户网站,其中包含定制的可视强制页面……在这里,我使用SOQL查询显示数据

在SOQL查询中添加一个子句,只返回帐户id与登录用户的帐户id匹配的记录,这是一个好主意吗

我做到了,而且效果很好……但是这种方法有没有我忽略的陷阱

谢谢, 卡尔文

因为标准控制器在用户模式下执行,其中 当前服务器的权限、字段级安全性和共享规则 用户是强制的,扩展标准控制器允许您构建 尊重用户权限的Visualforce页面。虽然 扩展类在标准控制器的系统模式下执行 在用户模式下执行。与自定义控制器一样,您可以指定 用户是否可以基于 用户的配置文件

我相信这样的想法是,只要您的类是共享的公共类,那么就应该强制执行权限,并且不应该返回用户看不到的记录(与记录上的字段相同)

根据

Apex通常在系统上下文中运行;即,当前用户的 权限、字段级安全性和共享规则不考虑在内 代码执行期间的帐户

声明类时,使用带有共享的
关键字来强制应用于当前用户的共享规则。例如:

public with sharing class sharingClass {

// Code here 


}
public without sharing class noSharing {

// Code here 


}
声明类时,请使用不共享的
关键字,以确保当前用户的共享规则不被强制执行。例如:

public with sharing class sharingClass {

// Code here 


}
public without sharing class noSharing {

// Code here 


}
否则,您将不得不花费数小时来确保在正确的时间为正确的用户应用正确的权限。这几乎完全违背了visualforce页面的目的

根据

因为标准控制器在用户模式下执行,其中 当前服务器的权限、字段级安全性和共享规则 用户是强制的,扩展标准控制器允许您构建 尊重用户权限的Visualforce页面。虽然 扩展类在标准控制器的系统模式下执行 在用户模式下执行。与自定义控制器一样,您可以指定 用户是否可以基于 用户的配置文件

我相信这样的想法是,只要您的类是共享的公共类,那么就应该强制执行权限,并且不应该返回用户看不到的记录(与记录上的字段相同)

根据

Apex通常在系统上下文中运行;即,当前用户的 权限、字段级安全性和共享规则不考虑在内 代码执行期间的帐户

声明类时,使用带有共享的
关键字来强制应用于当前用户的共享规则。例如:

public with sharing class sharingClass {

// Code here 


}
public without sharing class noSharing {

// Code here 


}
声明类时,请使用不共享的
关键字,以确保当前用户的共享规则不被强制执行。例如:

public with sharing class sharingClass {

// Code here 


}
public without sharing class noSharing {

// Code here 


}

否则,您将不得不花费数小时来确保在正确的时间为正确的用户应用正确的权限。这几乎完全违背了visualforce页面的目的

嗨,迈克,谢谢你的回复。我在控制器类声明中使用了“with sharing”关键字。组织范围内的默认设置在我需要在客户门户中显示的自定义对象上是公共的。因此,默认情况下,当用户查看报告页面时,他可以看到所有记录。我还可以在配置中做些什么来确保用户看不到任何与他的帐户不属于同一帐户的记录。这对我来说是一个真正的问题,我已经阅读了很多文档。但对于我们的共享模式,这是一个相当大的挑战。我对Salesforce CRM的客户门户部分的工作方式不太熟悉。我们使用它,但容量有限,我不必为此而努力。但是,我建议您使用适当的配置文件/角色/权限锁定这些对象,以便即使在门户中,用户也无法访问所有内容。否则,您可能会被迫在显示记录之前手动检查权限。谢谢Mike…我最终更改了安全设置并使用了高容量门户用户许可证。他们提供了一个开箱即用的设置来限制帐户的记录使用。嗨,迈克,谢谢你的回复。我在控制器类声明中使用了“with sharing”关键字。组织范围内的默认设置在我需要在客户门户中显示的自定义对象上是公共的。因此,默认情况下,当用户查看报告页面时,他可以看到所有记录。我还可以在配置中做些什么来确保用户看不到任何与他的帐户不属于同一帐户的记录。这对我来说是一个真正的问题,我已经阅读了很多文档。但对于我们的共享模式,这是一个相当大的挑战。我对Salesforce CRM的客户门户部分的工作方式不太熟悉。我们使用它,但容量有限,我不必为此而努力。但是,我建议您使用适当的配置文件/角色/权限锁定这些对象,以便即使在门户中,用户也无法访问所有内容。否则,您可能会被迫在显示记录之前手动检查权限。谢谢Mike…我最终更改了安全设置并使用了高容量p