4

Rhino.Security가 사용자/역할/권한을 관리하는 솔루션을 구현했습니다. 사용자가 허용되어 있는지 확인하는 Rhino.Security를 ​​호출Rhino.Security : DetachedCriteria에 대해 2 차 수준 캐시가 절대 실행되지 않습니다.

public class AuthorizationAttribute : ActionFilterAttribute 
{ 
    CustomPrincipal currentPrincipal = (CustomPrincipal)filterContext.HttpContext.User; 
    var actionName = filterContext.ActionDescriptor.ActionName;  
    var controllerName = filterContext.Controller.GetType().Name; 
    var operation = string.Format("/{0}/{1}", controllerName, actionName); 

    if (!securityService.CheckAuthorizationOnOperation(currentPrincipal.Code, operation)) 
    { 
    filterContext.Controller.TempData["ErrorMessage"] = string.Format("You are not authorized to perform operation: {0}", operation); 
    filterContext.Result = new HttpUnauthorizedResult(); 
    } 
} 

CheckAuthorizationOnOperation : 나는 사용자가 컨트롤러 액션에 액세스 할 수있는 권한이 있는지 확인하려는 때문에
, 나는 사용자 지정 작업 필터를 구현했습니다 작업은 지정된 :

AuthorizationService.IsAllowed(user, operation); 

모든 것이 제대로 작동하지만 에 의해 호출 쿼리를 실행을 IsAllowed 때 second-level 캐시 히트되지 않습니다 것으로 나타났습니다.
조사한 결과 프레임 워크 (Rhino.Security)가 DetachedCriteria을 사용한다는 것을 확인했습니다. 이들은라고 불리는이 개 과정은 다음과 같습니다

public Permission[] GetGlobalPermissionsFor(IUser user, string operationName) 
{ 
    string[] operationNames = Strings.GetHierarchicalOperationNames(operationName); 
    DetachedCriteria criteria = DetachedCriteria.For<Permission>() 
     .Add(Expression.Eq("User", user) 
      || Subqueries.PropertyIn("UsersGroup.Id", 
      SecurityCriterions.AllGroups(user).SetProjection(Projections.Id()))) 
     .Add(Expression.IsNull("EntitiesGroup")) 
     .Add(Expression.IsNull("EntitySecurityKey")) 
     .CreateAlias("Operation", "op") 
     .Add(Expression.In("op.Name", operationNames)); 

    return FindResults(criteria); 
} 

private Permission[] FindResults(DetachedCriteria criteria) 
{ 
    ICollection<Permission> permissions = criteria.GetExecutableCriteria(session) 
    .AddOrder(Order.Desc("Level")) 
    .AddOrder(Order.Asc("Allow")) 
    .SetCacheable(true) 
    .List<Permission>(); 
    return permissions.ToArray(); 
} 

당신이SetCacheable 사용 FindResults을 볼 수 있듯이.

페이지를 새로 고칠 때마다 조치 필터가 절차를 실행하고 캐시를 무시하고 (두 번째 수준) 쿼리가 다시 실행됩니다. 광범위하게 캐시를 사용하고 다른 모든 호출이 제대로 작동하므로이 기능이 예상대로 작동하지 않는 이유를 알고 싶습니다. 몇 가지 조사를하는

나는 second-level 캐시 내가 두 번 함수를 호출하는 경우에만 사용되는 것으로 나타났습니다 :

SecurityService.CheckAuthorizationOnOperation(currentPrincipal.Code, "/Users/Edit"); 
SecurityService.CheckAuthorizationOnOperation(currentPrincipal.Code, "/Users/Edit"); 

내가 사용하고있는 경우이 특정 상황에 대한 캐시에만 작동 보인다 같은 세션 (nHibernate). 무슨 일이 일어나는지 알아낼 수있는 사람이 있습니까?

UPDATE : enter image description here

+0

구성에서 쿼리 캐시를 활성화 했습니까? true llapinski

답변

1

이 프레임 워크에 문제가 있습니다. Google Groups에 대한 질문을 열었습니다. 누구나 알고 있지만 프레임 워크가 잊혀진 것 같습니다.

1
  1. 는 권한 개체가 캐시되어 있는지 확인 당신이 트랜잭션 내부의 일을하고 있는지 확인도
+0

디에고 도움에 감사드립니다. 내 질문을 업데이트했습니다. NHProf에서 이미지를 첨부했습니다. 나는 세션에 참가했습니다. 보시다시피 선택된 2 개의 쿼리는 트랜잭션 내부에 있지만 캐시되지는 않습니다. 사용자를로드하고 캐시됩니다. – LeftyX

관련 문제