저는 이것을 프로젝트에서 어떻게 구현할 것인지 설명하려고합니다. 요구 사항은 귀하의 권한과 유사합니다 : 사용자는 권한이있는 역할을 가지며 권한 정의, 역할의 권한 목록 및 사용자 역할 목록 등에서 모든 것이 바뀔 수 있습니다. 관리자가 다음과 같이 변경할 수 있습니다. 뭔가, 그는 접근 할 수 없다.
몇 가지 코드를 작성하기 전에 질문에 답변 해 드리겠습니다.
별도의 테이블 기반 보안을 만들어야합니까? 반환 된 기록이 이미립니다, 또는 컨트롤러의 일부가 될 한다 있도록
네
나는, 내 저장소에 보안을 할 수 있나요?
- 저는 보안이 비즈니스 로직의 일부가되어야한다고 생각합니다. 컨트롤러와 저장소 사이 어딘가에 넣을 것입니다.
컨트롤러 요청의 유효성을 검사하려면 보안 속성이 필요합니까?
- 내 프로젝트에서는 속성에 넣었지만 때로는 컨트롤러에서 액세스해야하지만 보안 계층을 비즈니스 계층에 보관해야하므로 문제가 아닌 것 같습니다. .
첫 번째 속성은 로그인 한 사용자가 실행할 수 있도록 간단한 속성입니다 조치 :
public class LoggedUserFilterAttribute : ActionFilterAttribute
{
public bool Logged { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!SessionManager.IsUserLogged)
{
filterContext.Result = new RedirectToRouteResult(GetRedirectToNotLoggedRouteValues());
this.Logged = false;
}
else
this.Logged = true;
}
public RouteValueDictionary GetRedirectToNotAuthorizedRouteValues()
{
RouteValueDictionary routeValues = new RouteValueDictionary();
routeValues.Add("action", "NotAuthorized");
routeValues.Add("controller", "Authorization");
return routeValues;
}
public RouteValueDictionary GetRedirectToNotLoggedRouteValues()
{
RouteValueDictionary routeValues = new RouteValueDictionary();
routeValues.Add("action", "NotLogged");
routeValues.Add("controller", "Authorization");
return routeValues;
}
}
하고 내가 가지고있는, 예를 들어, 수 속성이 슈퍼 유저 만이 액세스 할 수 :
public class SuperUserFilterAttribute : LoggedUserFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (Logged)
{
MyBaseController controller = filterContext.Controller as MyBaseController;
if (controller == null)
throw new Exception("Please use MyBaseController instead of built in Controller");
User loggedUser = controller.Model.UserBO.GetUserByID(SessionManager.LoggedUser.UserID);
if(!loggedUser.IsSuperUser)
{
filterContext.Result = new RedirectToRouteResult(GetRedirectToNotAuthorizedRouteValues());
}
}
}
}
MyBaseController는 Controller를 상속하는 클래스이며 Business Object의 컨테이너를 나타내는 Model 클래스의 인스턴스를가집니다. 컨트롤러 액션 본문에서 필요한 경우 현재 엔터티에 대한 사용자 권한을 확인하고 이에 따라 적절한보기를 반환합니다.
[LoggedUserFilter]
public ActionResult LoadSomeEntity(int customerServiceID,int entityID)
{
UserRights userPermissionsView = Model.SecurityBO.GetUsersRightsOnEntity(SessionManager.LoggedUser.UserID, entityID);
if(userPermissionsView.Write)
return View("EditEntity",Model.EntityBO.GetEntityByID(entityID));
if(userPermissionsView.Read)
return View("ViewEntity",Model.EntityBO.GetEntityByID(entityID));
return View("NotAuthorized");
}
p.s. 나는 분명히 나에게 훨씬 더 많은 경험이있는 누군가에게 어떤 것을 제안 할 수 있는지 확신 할 수 없다. 스팸을 보내는 경우 사과한다.
DAL/ORM의 부분 클래스에 상주하는 비즈니스 로직을 사용하는 방식을 선호하는 것 같습니다. 그게 옳은 것 같니? –
그래도 그보다는 더 뚜렷 하긴하지만. DAL에서 부분적으로 생각한다는 점을 염두에두고 생각했지만, 필자가 선호하는 방식은 항상 실제 비즈니스 계층에이를 적용하는 것이 었습니다. 물론이 레이어는 DAL 개체를 참조하지만 내 데이터베이스에서 비즈니스 로직을 분리합니다. 액세스 권리가 DAL 관심사가 아닌 비즈니스 규칙 인 것처럼 들립니다. – griegs
나는 그것을 비즈니스 논리에 넣는 아이디어를 좋아한다. 컨트롤러에서 보안 검사를 숨기고 보안 트리밍 작업을 한 번 수행하면됩니다. –