مثال عملی از استفاده از اتریبیوتها 🚀
بیایید یک اتریبیوت سفارشی برای مشخص کردن نقشهای مجاز برای دسترسی به یک متد کنترلر ایجاد کنیم: 🛡
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class AuthorizeRolesAttribute : Attribute
{
public string[] Roles { get; }
public AuthorizeRolesAttribute(params string[] roles)
{
Roles = roles;
}
}
سپس، ما AuthorizeRolesAttribute را به متدهای یک کلاس اعمال میکنیم و نقشهایی را که مجاز به دسترسی به هر متد هستند، مشخص میکنیم:
public class AccountController
{
[AuthorizeRoles("Admin", "Manager")]
public void AdminOnlyAction()
{
Console.WriteLine("Admin or Manager can access this method.");
}
[AuthorizeRoles("User")]
public void UserOnlyAction()
{
Console.WriteLine("Only users can access this method.");
}
public void PublicAction()
{
Console.WriteLine("Everyone can access this method.");
}
}
برای استفاده از این اتریبیوت، میتوانیم از reflection 🔍 برای گرفتن اطلاعات در مورد اینکه چه اتریبیوتهایی به یک متد اعمال شدهاند و چه پراپرتیهایی دارند، استفاده کنیم:
public class RoleBasedAccessControl
{
public void ExecuteAction(object controller, string methodName, string userRole)
{
var method = controller.GetType().GetMethod(methodName);
var attribute = method?.GetCustomAttribute<AuthorizeRolesAttribute>();
if (attribute is null || attribute.Roles.Contains(userRole))
{
method?.Invoke(controller, null);
}
else
{
Console.WriteLine("Access denied. User does not have the required role.");
}
}
}
در اینجا ما یک متد را با نام از یک کلاس کنترلر میگیریم و بررسی میکنیم که آیا اتریبیوت AuthorizeRolesAttribute به متد اعمال شده است یا نه. اگر اعمال شده باشد، بررسی میکنیم که آیا یک کاربر میتواند به متد داده شده دسترسی داشته باشد یا نه.
در نهایت، میتوانیم منطق کنترل دسترسی مبتنی بر نقش را با نقشهای مختلف کاربر تست کنیم: 🧪
var controller = new AccountController();
var accessControl = new RoleBasedAccessControl();
Console.WriteLine("Testing with Admin role:");
accessControl.ExecuteAction(controller, nameof(AccountController.AdminOnlyAction), "Admin");
Console.WriteLine("\nTesting with User role:");
accessControl.ExecuteAction(controller, nameof(AccountController.UserOnlyAction), "User");
Console.WriteLine("\nTesting with Guest role:");
accessControl.ExecuteAction(controller, nameof(AccountController.AdminOnlyAction), "Guest");
Console.WriteLine("\nTesting public method with Guest role:");
accessControl.ExecuteAction(controller, nameof(AccountController.PublicAction), "Guest");
خروجی: 🖥
Testing with Admin role:
Admin or Manager can access this method.
Testing with User role:
Only users can access this method.
Testing with Guest role:
Access denied. User does not have the required role.
Testing public method with Guest role:
Everyone can access this method.
در این مثال، AuthorizeRolesAttribute برای مشخص کردن نقشهای مجاز برای دسترسی به هر متد در AccountController استفاده میشود. کلاس RoleBasedAccessControl این محدودیتها را با بررسی نقش کاربر در برابر نقشهای تعریف شده در اتریبیوت، اعمال میکند. این نشان میدهد که چگونه میتوان از اتریبیوتهای سفارشی به روشی عملی و مفید در یک سناریوی دنیای واقعی استفاده کرد. ✅