RoleController.cs 5.4 KB

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