Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now! Learn more
Hi,
I have scenario, where i would like to implement RLS security with current login user. I have three tables i.e.
UserRole
UserId | Role |
Admin | System Admin |
User1 | AR clerk |
User1 | AP manager |
User1 | Sales Clerk 1 |
User2 | Sales Clerk 2 |
User2 | System Admin |
UserLocationPermission
UserId | Location | CanViewInventory |
User1 | Miami | 1 |
User1 | Seattle | 0 |
User2 | Los angles | 1 |
User2 | New York | 1 |
Inventory
Location | Item | Quantity |
Miami | Item1 | 10 |
Seattle | Item2 | 20 |
Los angles | Item3 | 30 |
New York | Item4 | 40 |
When User1 logins: (limited data of only 1 location since canviewinventory is enabled for it)
Inventory
Location | Item | Quantity |
Miami | Item1 | 10 |
When User2 logins: (can view all data since it has system admin role)
Inventory
Location | Item | Quantity |
Miami | Item1 | 10 |
Seattle | Item2 | 20 |
Los angles | Item3 | 30 |
New York | Item4 | 40 |
When Admin logins: (can view all data since it has system admin role)
Inventory
Location | Item | Quantity |
Miami | Item1 | 10 |
Seattle | Item2 | 20 |
Los angles | Item3 | 30 |
New York | Item4 | 40 |
Pls guide me on how can I implement dynamic filtering of rows of Inventory table in visual in Power BI based on current user login.
Thank you.
Solved! Go to Solution.
Hi @jeffgreenrc ,
In your scenario, you can set up the RLS filter directly on the Inventory table. This will allow admins to view all rows, while other users will only see rows permitted by their location access. You can use an expression like the following.
VAR CurrentUser = USERPRINCIPALNAME()
VAR IsSystemAdmin =
CALCULATE (
COUNTROWS ( UserRole ),
UserRole[UserId] = CurrentUser &&
UserRole[Role] = "System Admin"
)
RETURN
IF (
IsSystemAdmin > 0,
TRUE(),
Inventory[Location] IN
CALCULATETABLE (
VALUES ( UserLocationPermission[Location] ),
UserLocationPermission[UserId] = CurrentUser,
UserLocationPermission[CanViewInventory] = 1
)
)
Here’s an example expression you can try, please test it, and let us know how it goes.
This logic determines whether the current user has the System Admin role. If so, they are not subject to filtering and can view all rows. If not, the filter limits Inventory rows to locations where the user has permission (CanViewInventory = 1).
Please implement this as the RLS rule on the Inventory table and test it using View as Role in Power BI Desktop to ensure it works correctly for your users.
Regards,
Yugandhar.
Thanks @danextian ,
Pls provide more detail on your solution. Should i define relationship between tables and where should i define the filter condition you have provided.
Sorry for my ignore as I am new to power bi.
Create a many-to-many single direction relationship from UserRole[UserID] to UserLocationPermission[UserID]
Go to modelling view. Go to manage roles. Look for UserRole table and create a role using either of the formula given (note: switch to dax editor view). In the service, go to security settings and add the users to the role - users need to be added manually in the service or if they are in a security group, use that security group.
Also, there is a link from @parry2k, have you had a look at it?
Thanks @danextian ,
I am able to filter userrole and userlocationpermission but not Inventory.
The reason is i can not make active relationship between inventory and userlocationpermission because admin would not have records in the userlocationpermission since they can view all location.
I am trying to implement RLS on inventory table with
Location IN values(LocationPermission[Location])
but the above is not working and giving error, even lookupvalue is not working.
How can i filter inventory table records without active relationship with locationpermission table.
Hi @jeffgreenrc ,
In your scenario, you can set up the RLS filter directly on the Inventory table. This will allow admins to view all rows, while other users will only see rows permitted by their location access. You can use an expression like the following.
VAR CurrentUser = USERPRINCIPALNAME()
VAR IsSystemAdmin =
CALCULATE (
COUNTROWS ( UserRole ),
UserRole[UserId] = CurrentUser &&
UserRole[Role] = "System Admin"
)
RETURN
IF (
IsSystemAdmin > 0,
TRUE(),
Inventory[Location] IN
CALCULATETABLE (
VALUES ( UserLocationPermission[Location] ),
UserLocationPermission[UserId] = CurrentUser,
UserLocationPermission[CanViewInventory] = 1
)
)
Here’s an example expression you can try, please test it, and let us know how it goes.
This logic determines whether the current user has the System Admin role. If so, they are not subject to filtering and can view all rows. If not, the filter limits Inventory rows to locations where the user has permission (CanViewInventory = 1).
Please implement this as the RLS rule on the Inventory table and test it using View as Role in Power BI Desktop to ensure it works correctly for your users.
Regards,
Yugandhar.
Thanks a lot !
Thank you for responses.
The issue is I cannot make the relationship between tables active since I dont want to retrieve records from Inventory table based on it. The reason is the, the Admin user record is not present in UserLocationPermission table.
Therefore, I need to identify if the user belongs to System role then view all records i.e. make the join inactive.
If user does not have system admin role, then it needs to show records matching with UserLocationPermission and Inventory table.
So how can I dynamically filter records in inventory table.
Hi @jeffgreenrc
I am assuming your role table already includes the email addresses. Try the following RLS expressions:
VAR CurrentUser =
USERPRINCIPALNAME ()
VAR CurrentRole =
CALCULATE (
MAX ( UserRole[Role] ),
KEEPFILTERS ( UserRole[Email] = USERPRINCIPALNAME () )
)
RETURN
IF (
CurrentRole = "System Admin",
TRUE (),
// admin - full access
RELATED ( UserRole[Email] ) = CurrentUser // non-admin - only related rows
)
==============================
VAR CurrentUser =
USERPRINCIPALNAME ()
VAR CurrentRole =
LOOKUPVALUE ( UserRole[Role], UserRole[Email], CurrentUser )
RETURN
IF (
CurrentRole = "System Admin",
TRUE (),
// admin - full access
RELATED ( UserRole[Email] ) = CurrentUser // non-admin - only related rows
)
Since your userid repeats, you might end up creating a many-to-many relationship from UserRole to permission tables. Ensure that it is single direction only.
@jeffgreenrc it is pretty straight to setup, check out this blog post and make the changes as per your scenario
Subscribe to the @PowerBIHowTo YT channel for an upcoming video on List and Record functions in Power Query!!
Learn Power BI and Fabric - subscribe to our YT channel - Click here: @PowerBIHowTo
If my solution proved useful, I'd be delighted to receive Kudos. When you put effort into asking a question, it's equally thoughtful to acknowledge and give Kudos to the individual who helped you solve the problem. It's a small gesture that shows appreciation and encouragement! ❤
Did I answer your question? Mark my post as a solution. Proud to be a Super User! Appreciate your Kudos 🙂
Feel free to email me with any of your BI needs.
The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now!
| User | Count |
|---|---|
| 38 | |
| 36 | |
| 33 | |
| 33 | |
| 29 |
| User | Count |
|---|---|
| 134 | |
| 96 | |
| 78 | |
| 67 | |
| 65 |