RoleController.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System.Diagnostics;
  2. using System.Security.Claims;
  3. using bitforum.Models;
  4. using bitforum.Models.Views;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.AspNetCore.Identity;
  8. using Microsoft.EntityFrameworkCore;
  9. namespace bitforum.Controllers.Director
  10. {
  11. [Authorize]
  12. [Route("Director")]
  13. public class RoleController : Controller
  14. {
  15. private readonly ILogger<RoleController> _logger;
  16. private readonly string _RoleViewPath = "~/Views/Director/Role.cshtml";
  17. private readonly string _PermissionViewPath = "~/Views/Director/Permission.cshtml";
  18. private readonly RoleManager<IdentityRole> _roleManager;
  19. public RoleController(ILogger<RoleController> logger, RoleManager<IdentityRole> roleManager)
  20. {
  21. _logger = logger;
  22. _roleManager = roleManager;
  23. }
  24. [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  25. public IActionResult Error()
  26. {
  27. return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
  28. }
  29. [HttpGet("Role")]
  30. public async Task<IActionResult> Index()
  31. {
  32. var roles = await _roleManager.Roles.ToListAsync();
  33. var roleClaimsCount = new Dictionary<string, int>();
  34. if (roles.Count > 0)
  35. {
  36. foreach (var role in roles)
  37. {
  38. var claims = await _roleManager.GetClaimsAsync(role);
  39. roleClaimsCount[role.Name] = claims.Count;
  40. }
  41. }
  42. ViewBag.RoleClaimsCount = roleClaimsCount;
  43. return View(_RoleViewPath, roles);
  44. }
  45. [HttpPost("Role")]
  46. public async Task<IActionResult> Add([FromForm(Name = "role_name")] string name)
  47. {
  48. try {
  49. // 수동 유효성 검사
  50. if (string.IsNullOrWhiteSpace(name))
  51. {
  52. ModelState.AddModelError("Role:", "역할 이름은 필수입니다.");
  53. }
  54. else if (name.Length > 256)
  55. {
  56. ModelState.AddModelError("Role:", "역할 이름은 256자를 초과할 수 없습니다.");
  57. }
  58. if (!ModelState.IsValid)
  59. {
  60. throw new Exception("역할 추가에 실패하였습니다.");
  61. }
  62. if (await _roleManager.RoleExistsAsync(name))
  63. {
  64. ModelState.AddModelError("Role:", $"{name} 은 이미 존재합니다.");
  65. throw new Exception("역할 중복 오류");
  66. }
  67. }
  68. catch (Exception e)
  69. {
  70. var roles = await _roleManager.Roles.ToListAsync();
  71. _logger.LogError(e, e.Message);
  72. TempData["ErrorMessages"] = "역할 추가가 정상적으로 완료되었습니다.";
  73. return View(_RoleViewPath, roles);
  74. }
  75. await _roleManager.CreateAsync(new IdentityRole(name.Trim()));
  76. var message = $"{name}이 정상적으로 추가되었습니다.";
  77. TempData["SuccessMessage"] = message;
  78. _logger.LogInformation(message);
  79. return RedirectToAction("index", "Role");
  80. }
  81. [HttpGet("ManagePermissions")]
  82. public async Task<IActionResult> ManagePermissions(string roleID)
  83. {
  84. var role = await _roleManager.FindByIdAsync(roleID);
  85. if (role == null)
  86. {
  87. return NotFound();
  88. }
  89. // 역할에 따른 권한들 조회
  90. var roleClaims = _roleManager.GetClaimsAsync(role).Result.Select(c => c.Value).ToList();
  91. // 권한 생성
  92. var allClaims = Permissions.GeneratePermissions();
  93. // 모든 권한 목록 생성
  94. var allPermissions = allClaims.Select(p => new CheckBoxViewModel { DisplayValue = p, IsSelected = roleClaims.Contains(p) }).ToList();
  95. var viewModel = new PermissionsFormViewModel
  96. {
  97. RoleID = roleID,
  98. RoleName = role.Name,
  99. RoleClaims = allPermissions
  100. };
  101. return View(_PermissionViewPath, viewModel);
  102. }
  103. [HttpPost("ManagePermissions")]
  104. public async Task<IActionResult> ManagePermissions(PermissionsFormViewModel request)
  105. {
  106. var role = await _roleManager.FindByIdAsync(request.RoleID);
  107. if (role == null)
  108. {
  109. return NotFound();
  110. }
  111. var roleClaims = await _roleManager.GetClaimsAsync(role);
  112. foreach (var claim in roleClaims)
  113. {
  114. await _roleManager.RemoveClaimAsync(role, claim);
  115. }
  116. var selectedClaims = request.RoleClaims.Where(c => c.IsSelected).ToList();
  117. foreach (var claim in selectedClaims)
  118. {
  119. await _roleManager.AddClaimAsync(role, new Claim("Permission", claim.DisplayValue));
  120. }
  121. var message = "권한이 정상적으로 적용되었습니다.";
  122. TempData["SuccessMessage"] = message;
  123. _logger.LogInformation(message);
  124. return RedirectToAction("ManagePermissions", "Role", new { request.RoleID });
  125. }
  126. }
  127. }