If “With Sharing” keyword is used in the Apex Class, then the SOQL won’t run in System Mode. It will run in User Mode and respect the Restriction Rules configured.
Custom Field in User Object for User Criteria:
Visualforce Page:
<apex:page controller=”EmployeesDataController”>
<apex:pageBlock>
<apex:pageBlockTable value=”{!listEmployees}” var=”emp”>
<apex:column>{!emp.Name}</apex:column>
<apex:column>{!emp.Age__c}</apex:column>
<apex:column>{!emp.Above_18__c}</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
<apex:page controller=”EmployeesDataController”>
<apex:pageBlock>
<apex:pageBlockTable value=”{!listEmployees}” var=”emp”>
<apex:column>{!emp.Name}</apex:column>
<apex:column>{!emp.Age__c}</apex:column>
<apex:column>{!emp.Above_18__c}</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
Apex Class:
public with sharing class EmployeesDataController {
public List < Employee__c > listEmployees { get; set; }
public EmployeesDataController() {
listEmployees = new List < Employee__c >();
listEmployees = [ SELECT Id, Name, Age__c, Above_18__c FROM Employee__c LIMIT 100 ];
}
}
Output:
If “with sharing” keyword is removed, the SOQL will run in System Mode and return all the data. It won’t obey the Restriction Rule.