<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Enterprise Row-Level Security via SOI + Portal Groups - is my plan feasible? in ArcGIS Enterprise Questions</title>
    <link>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1621852#M42376</link>
    <description>&lt;P&gt;Your leadership is failing you by letting IT off the hook.&amp;nbsp; Everything you state "IT cannot" do is easily doable by even a marginally component IT shop, so it is really about what "IT won't" do.&amp;nbsp; My experience with SOIs is they should only be used when absolutely necessary because they require effort to create and deploy and technical debt to maintain, so they are definitely not a free lunch.&amp;nbsp; Good luck.&lt;/P&gt;</description>
    <pubDate>Mon, 09 Jun 2025 15:27:37 GMT</pubDate>
    <dc:creator>JoshuaBixby</dc:creator>
    <dc:date>2025-06-09T15:27:37Z</dc:date>
    <item>
      <title>Enterprise Row-Level Security via SOI + Portal Groups - is my plan feasible?</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1612852#M42191</link>
      <description>&lt;P class=""&gt;Hey guys, I've been working an outline for implementing row-level feature filtering with SOIs combined with map/dashboard filtering using Enterprise Portal groups.&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Below is the outline of my approach. Does anyone see any issues or reasons this wouldn't work? I'm particularly interested in feedback from anyone who's implemented something similar - did you run into any pitfalls I should be aware of? The goal is to filter features based on region without creating separate services for each user group.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H1&gt;ArcGIS Enterprise Security Demo: Row-Level Feature Filtering with SOIs&lt;/H1&gt;&lt;H2&gt;Executive Summary&lt;/H2&gt;&lt;P&gt;This demonstration showcases a practical solution to a common enterprise GIS security challenge: providing row-level data access control without requiring individual database accounts. Using a combination of ArcGIS Portal groups and a custom Server Object Interceptor (SOI), we can deliver personalized data views to different user groups while maintaining a single database connection. This approach addresses our current IT constraints while still meeting security requirements.&lt;/P&gt;&lt;P&gt;The solution leverages Portal groups to control dashboard visibility and a PostgreSQL-driven SOI to filter map features dynamically based on user permissions. When users log in, they'll only see the dashboards relevant to their role and, within maps, only the data they have permission to access. This two-tiered approach provides comprehensive security without requiring database-level modifications or individual database credentials.&lt;/P&gt;&lt;H2&gt;Current Environment Constraints&lt;/H2&gt;&lt;P&gt;Our organization faces several constraints that prevent implementing traditional row-level security directly in the database:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Single Database Connection&lt;/STRONG&gt;: All feature services connect to PostgreSQL using a single "data-owner" account via .sde files. IT cannot provide individual database logins for each user.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Limited IT Support&lt;/STRONG&gt;: The IT department cannot assist with database-level security configuration before this demo. Any solution must work within existing infrastructure.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Portal-Centric Enterprise&lt;/STRONG&gt;: Our ArcGIS Enterprise deployment is heavily Portal-centric, with a requirement to maintain consistent user experiences through Enterprise Sites.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Maintenance Overhead Concerns&lt;/STRONG&gt;: We must avoid creating and maintaining multiple view layers and separate maps and dashboards for each user group. With our environment expected to grow to over 100 maps, dashboards, and Experience Builder apps, and potentially hundreds of users, managing multiple instances of nearly identical content would create an unsustainable maintenance burden.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Security Requirements&lt;/STRONG&gt;: Despite these constraints, we need to demonstrate secure, filtered views of the same data based on user permissions.&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;H2&gt;Solution Architecture: SOI-Based Feature Filtering&lt;/H2&gt;&lt;P&gt;We've designed an SOI-based solution that provides row-level security without requiring changes to the database authentication model:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Portal Groups for Application Security&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Use Portal's built-in groups (West-Users, East-Users, Admin) to control access to entire dashboards/applications&lt;/LI&gt;&lt;LI&gt;Users will only see dashboard cards they have permission to access&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Java SOI for Feature-Level Security&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Deploy a custom Server Object Interceptor (SOI) that intercepts REST requests&lt;/LI&gt;&lt;LI&gt;Extract the requesting user's email from the request&lt;/LI&gt;&lt;LI&gt;Query a PostgreSQL lookup table to determine user permissions&lt;/LI&gt;&lt;LI&gt;Dynamically modify queries to filter features based on permissions&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;PostgreSQL Lookup Table&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Simple soi_user_groups table that maps emails to permission groups&lt;/LI&gt;&lt;LI&gt;All database access still occurs via the single "data-owner" account&lt;/LI&gt;&lt;LI&gt;No changes to existing database security model required&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Single Map Instance Approach&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Maintain just one version of each map, dashboard, and Experience Builder app&lt;/LI&gt;&lt;LI&gt;Avoid creating separate view layers for each security context&lt;/LI&gt;&lt;LI&gt;The SOI dynamically filters data based on user permissions&lt;/LI&gt;&lt;LI&gt;Eliminates the need to create and maintain separate content for each user group&lt;/LI&gt;&lt;LI&gt;Ensures consistency across all applications and dashboards&lt;/LI&gt;&lt;LI&gt;Scales efficiently as we grow to 100+ maps and dashboards with hundreds of users&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Preserved Editing Capabilities&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Users with editor privileges in Portal can still edit features&lt;/LI&gt;&lt;LI&gt;Editing is naturally restricted to only the features they can see&lt;/LI&gt;&lt;LI&gt;No separate configuration needed to control edit permissions&lt;/LI&gt;&lt;LI&gt;West users can edit West features, East users can edit East features&lt;/LI&gt;&lt;LI&gt;Admin users can edit all features&lt;/LI&gt;&lt;LI&gt;Enterprise role-based permissions continue to function normally&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;H2&gt;Demo Implementation&lt;/H2&gt;&lt;P&gt;The demo implementation includes:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;PostgreSQL Components&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Lookup table with email-to-group mappings&lt;/LI&gt;&lt;LI&gt;Three sample users: alice@corp.com (West), bob@corp.com (East), carol@corp.com (Admin)&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Java SOI&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;QuickDBFilterSOI class that intercepts REST requests&lt;/LI&gt;&lt;LI&gt;User permission caching to improve performance (5-minute TTL)&lt;/LI&gt;&lt;LI&gt;Runtime query modification to filter rows based on the region field&lt;/LI&gt;&lt;LI&gt;Temporary hard-coded database credentials (will move to Credential Store after approval)&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Portal Configuration&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Three user groups controlling dashboard visibility&lt;/LI&gt;&lt;LI&gt;Single Enterprise Site containing all dashboards&lt;/LI&gt;&lt;LI&gt;Appropriate item sharing to implement group-based access control&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;H2&gt;What This Demo Will Show&lt;/H2&gt;&lt;P&gt;This demo will clearly demonstrate to management:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Multi-Level Security&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Portal groups hiding entire dashboards from unauthorized users&lt;/LI&gt;&lt;LI&gt;Feature-level filtering showing only authorized data to each user&lt;/LI&gt;&lt;LI&gt;All through a single Enterprise Site URL&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;User Experience&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Alice (West user) sees West Dashboard and only West region features&lt;/LI&gt;&lt;LI&gt;Bob (East user) sees East Dashboard and only East region features&lt;/LI&gt;&lt;LI&gt;Carol (Admin) sees all dashboards and all features&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Technical Feasibility&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Row-level security without database authentication changes&lt;/LI&gt;&lt;LI&gt;Minimal impact on existing infrastructure&lt;/LI&gt;&lt;LI&gt;Scalable approach that can be expanded to production&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;H2&gt;What Users Will See&lt;/H2&gt;&lt;P&gt;User Portal Group DB Permission Visible Content Visible Features Editing Capability&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;Alice&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;West-Users&lt;/TD&gt;&lt;TD&gt;['west']&lt;/TD&gt;&lt;TD&gt;• Enterprise Site&amp;lt;br&amp;gt;• Plant Map&amp;lt;br&amp;gt;• &lt;STRONG&gt;West Dashboard&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;Only features with region='west'&lt;/TD&gt;&lt;TD&gt;Can edit West features if assigned editor role&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;Bob&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;East-Users&lt;/TD&gt;&lt;TD&gt;['east']&lt;/TD&gt;&lt;TD&gt;• Enterprise Site&amp;lt;br&amp;gt;• Plant Map&amp;lt;br&amp;gt;• &lt;STRONG&gt;East Dashboard&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;Only features with region='east'&lt;/TD&gt;&lt;TD&gt;Can edit East features if assigned editor role&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;Carol&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;Admin&lt;/TD&gt;&lt;TD&gt;['admin']&lt;/TD&gt;&lt;TD&gt;• Enterprise Site&amp;lt;br&amp;gt;• Plant Map&amp;lt;br&amp;gt;• &lt;STRONG&gt;West Dashboard&lt;/STRONG&gt;&amp;lt;br&amp;gt;• &lt;STRONG&gt;East Dashboard&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;All features (admin sees everything)&lt;/TD&gt;&lt;TD&gt;Can edit all features if assigned editor role&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;H3&gt;Key Implementation Requirements&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Data Layer Requirements&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Feature layer must have a &lt;STRONG&gt;region&lt;/STRONG&gt; field containing values like "east", "west", "admin"&lt;/LI&gt;&lt;LI&gt;These values must exactly match the values stored in the PostgreSQL lookup table&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Portal Configuration&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Create three groups: &lt;STRONG&gt;West-Users&lt;/STRONG&gt;, &lt;STRONG&gt;East-Users&lt;/STRONG&gt;, &lt;STRONG&gt;Admin&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;Share the Enterprise Site to the Organization (everyone can access the URL)&lt;/LI&gt;&lt;LI&gt;Share the base map to the Organization (everyone can see it, SOI filters the rows)&lt;/LI&gt;&lt;LI&gt;Share the West Dashboard only to &lt;STRONG&gt;West-Users&lt;/STRONG&gt; group&lt;/LI&gt;&lt;LI&gt;Share the East Dashboard only to &lt;STRONG&gt;East-Users&lt;/STRONG&gt; group&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;SOI Configuration&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Deploy the SOI to ArcGIS Server&lt;/LI&gt;&lt;LI&gt;Enable it on the target feature service&lt;/LI&gt;&lt;LI&gt;Configure constants to match your environment (service name, layer IDs, field name)&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;H2&gt;Future Enhancements (Post-Demo)&lt;/H2&gt;&lt;P&gt;After successful demonstration and approval, we plan to enhance the solution:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Move database credentials to ArcGIS Credential Store&lt;/LI&gt;&lt;LI&gt;Add configurable failure modes with user-friendly error messages&lt;/LI&gt;&lt;LI&gt;Implement comprehensive logging and performance metrics&lt;/LI&gt;&lt;LI&gt;Move configuration to external files instead of hard-coded constants&lt;/LI&gt;&lt;LI&gt;Work with IT to evaluate more integrated security options&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;So is this possible?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 08 May 2025 15:58:13 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1612852#M42191</guid>
      <dc:creator>JonJones1</dc:creator>
      <dc:date>2025-05-08T15:58:13Z</dc:date>
    </item>
    <item>
      <title>Re: Enterprise Row-Level Security via SOI + Portal Groups - is my plan feasible?</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1621821#M42374</link>
      <description>&lt;P&gt;I can't say if this will work but would like to comment.&lt;/P&gt;&lt;P&gt;If we have less functionality from a DBMS after it goes through ArcGIS Server and Portal, should we be asking questions? There are cases when a person may want to remove certain functions, which is a different scenario.&lt;/P&gt;&lt;P&gt;Column and row-level permissions are available in some DBMSs, but after going through ArcGIS Server and Portal these capabilities are mostly lost.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 09 Jun 2025 13:57:53 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1621821#M42374</guid>
      <dc:creator>PaulLohr</dc:creator>
      <dc:date>2025-06-09T13:57:53Z</dc:date>
    </item>
    <item>
      <title>Re: Enterprise Row-Level Security via SOI + Portal Groups - is my plan feasible?</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1621852#M42376</link>
      <description>&lt;P&gt;Your leadership is failing you by letting IT off the hook.&amp;nbsp; Everything you state "IT cannot" do is easily doable by even a marginally component IT shop, so it is really about what "IT won't" do.&amp;nbsp; My experience with SOIs is they should only be used when absolutely necessary because they require effort to create and deploy and technical debt to maintain, so they are definitely not a free lunch.&amp;nbsp; Good luck.&lt;/P&gt;</description>
      <pubDate>Mon, 09 Jun 2025 15:27:37 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1621852#M42376</guid>
      <dc:creator>JoshuaBixby</dc:creator>
      <dc:date>2025-06-09T15:27:37Z</dc:date>
    </item>
    <item>
      <title>Re: Enterprise Row-Level Security via SOI + Portal Groups - is my plan feasible?</title>
      <link>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1667683#M43471</link>
      <description>&lt;P&gt;Hi, have you got an update to this please?&amp;nbsp; Really interested if your approach worked as am looking at something similar.&amp;nbsp; Thanks&lt;/P&gt;</description>
      <pubDate>Thu, 20 Nov 2025 21:00:10 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-enterprise-questions/enterprise-row-level-security-via-soi-portal/m-p/1667683#M43471</guid>
      <dc:creator>Geographer80</dc:creator>
      <dc:date>2025-11-20T21:00:10Z</dc:date>
    </item>
  </channel>
</rss>

