Skip to main content

Power BI RLS Implementation & Validation

Audience & Scope

Audience:

  • Power BI Developers
  • BI Analysts
  • Report Owners

Scope: This document explains the implementation and validation of Static and Dynamic Row-Level Security (RLS) in Power BI Desktop and Power BI Service.


What is Row-Level Security (RLS)?

Row-Level Security (RLS) restricts data at the row level so users only see data they are authorized to view.

How RLS works:

  • Defined in Power BI Desktop
  • Enforced in Power BI Service
  • Applied through roles

Prerequisites Before Implementing RLS

Required

  • Proper star schema design
  • Fact tables connected to dimension tables
  • Correct relationships and filter directions
  • Clear understanding of access-controlling columns
    • Examples: Region, BusinessUnit, PropertyID

Important

Workspace Admins bypass RLS by default. Always test RLS using Viewer or Member roles.


Types of RLS

  • Static RLS → Hard-coded filters
  • Dynamic RLS → Filters based on logged-in user
    • USERPRINCIPALNAME() – Returns the user's email (recommended for Power BI Service)
    • USERNAME() – Not reliable in Service scenarios

Before implementing RLS, ensure:

Data Model Readiness

  • Fact tables are connected to dimension tables
  • Relationships are correct (direction matters)

Access Clarity

  • Know which column controls access
    • Example: Region, BusinessUnit, PropertyID

Static RLS

What is Static RLS?

  • Data access rules are hard-coded
  • Each role is created manually
  • Users assigned to a role always see the same data

Example

  • Role A → Region = East
  • Role B → Region = West

Design Decisions

  • Which column controls access?
  • Where does that column live?

✅ Best Practice

  • Use a dimension table column
    • Example:
      • Table: DimRegion
      • Column: Region

❌ Avoid

  • Using fact table columns for RLS

Steps to Implement Static RLS

1. Open Power BI Desktop

  • Go to the Modeling tab
  • Click Manage roles

2. Create a New Role

  • Click New
  • Rename the role
    • Example: East_Region_Role

    Use business-friendly names so admins understand the purpose later


Apply the Static Filter

  • In Manage roles, select the table where the security column exists
  • In the filter box, write a boolean DAX expression
    DimRegion[Region] = "East"
  • Only rows where Region = "East" will be visible

How the Filter Works (Important Concept)

  • Power BI filters the dimension table
  • The filter flows through relationships
  • Fact tables are automatically filtered

Validate the Role in Desktop

Never skip this step

  • Go to Modeling → View as
  • Select the respective role
  • Click OK
  • Review visuals:
    • Only the respective region data should appear

If Data Looks Wrong

  • Check relationships
  • Check column values (case sensitivity, extra spaces)

Save and Publish the Report

  • Click Save
  • Click Publish
  • Publish to the required workspace

📌 Note:

info

RLS does not work locally after publishing — it is enforced in Power BI Service.


Assign Users to Roles in Power BI Service

  • Open Power BI Service
  • Navigate to the Workspace
  • Locate the Semantic Model (Dataset)
  • Click More options (⋮)Security
  • Add users or Azure AD Groups to the role
  • Click Save

Static RLS is now active


When Static RLS Is a Good Choice

  • Small number of roles
  • Stable access rules
  • Limited number of users
  • Large organizations
  • Frequent access changes
  • Complex access logic

What Is Dynamic RLS?

Dynamic RLS restricts data based on the logged-in user.

  • A single role supports multiple users
  • Access is driven by a security mapping table
  • Evaluated using DAX

📌 Notes:

  • UserEmail must exactly match the Power BI login email
  • A user can have multiple rows for multiple regions or entities

Load the Security Table

The security table can be loaded from:

  • Excel
  • SQL Server / Database
  • SharePoint list
  • Power BI Dataflow

Ensure Data Quality

  • No leading or trailing spaces
  • Correct email casing
  • No duplicate or invalid values

Create Relationships

  1. Go to Model view
  2. Create a relationship:
    • UserSecurity[Region] → DimRegion[Region]

Relationship Configuration

  • Cardinality: Many-to-One
  • Cross filter direction: Single
  • Status: Active

📌 This relationship allows RLS filters to propagate to fact tables.


Create the Dynamic RLS Role

  • Go to Modeling → Manage roles

  • Click Create

  • Name the role (example: Dynamic_Region_RLS)

  • Select the UserSecurity table

  • Add the following DAX filter:

    UserSecurity[UserEmail] = USERPRINCIPALNAME()

✔ This ensures:

  • Power BI captures the logged-in user
  • Only rows belonging to that user remain visible
  • Allowed values propagate through relationships to dimension and fact tables

How Dynamic RLS Works Internally

  1. User logs into Power BI Service
  2. USERPRINCIPALNAME() returns the user's email
  3. Power BI filters the UserSecurity table
  4. Allowed dimension values (Region / BU / Property) are identified
  5. Related fact tables are automatically filtered

Test Dynamic RLS in Power BI Desktop

  1. Go to Modeling → View as
  2. Select the Dynamic RLS role
  3. Enter a test email address
  4. Click OK
  5. Validate the data shown in visuals

📌 Always test with:

  • Valid user
  • User with multiple access rows
  • Invalid user (should see no data)

Publish the Report

  1. Save the report
  2. Publish to Power BI Service
  3. Open the target Workspace

Assign Users to the Dynamic RLS Role

  1. In Power BI Service, open the Semantic Model (Dataset)
  2. Select Security
  1. Add:
    • Individual users, or
    • Azure AD Groups
  2. Click Save

📌 Every secured user must be assigned to this role.


Validate Dynamic RLS in Power BI Service

  1. Select View as
  2. Choose the RLS role
  3. Enter the user's email ID
  4. Validate data visibility matches expectations

Best Practices

  • ✔ Apply RLS only on dimension tables
  • ✔ Prefer Dynamic RLS for scalability
  • ✔ Use Azure AD Groups instead of individual users
  • ✔ Keep security logic simple and readable
  • ✔ Maintain the security table centrally
  • ✔ Avoid bi-directional relationships unless absolutely required

Common Issues & Fixes

User Sees No Data

  • ✔ Email mismatch between Power BI login and security table
  • ✔ Relationship missing or inactive
  • ✔ User not assigned to the RLS role

User Sees All Data

  • ✔ User is Workspace Admin
  • ✔ Role not assigned in Power BI Service

What Is an AD Group?

An AD Group (Azure Active Directory / Microsoft Entra ID Group) is a centrally managed collection of users.

Uses in Power BI

  • Assign RLS roles
  • Control workspace access
  • Manage app permissions

📌 Instead of adding users individually, add one AD Group.


Why AD Groups Are Important

Without AD Groups

  • Manual user management
  • High maintenance
  • Risk of missing access updates

With AD Groups

  • Centralized access control
  • Scalable security
  • Enterprise best practice

Example: Add Finance_ReadOnly_Group to an RLS role → all finance users get access automatically.


Where Are AD Groups Created?

AD Groups are created in Microsoft Entra ID (Azure AD).

Create AD Group via Azure Portal

  1. Go to portal.azure.com
  2. Sign in with Admin credentials
  3. Navigate to Microsoft Entra ID → Groups
  4. Click New group

Benefits

  • ✓ Centralized access management
  • ✓ Reduced maintenance
  • ✓ Enterprise-grade security

Security Validation Checklist

  • ✓ Tested with valid user
  • ✓ Tested with multi-access user
  • ✓ Tested with no-access user
  • ✓ Tested in Power BI Service
  • ✓ Verified non-admin behavior
  • ✓ AD Group assignment validated