2016-08-09 3 views
1

역할 사용 권한을 만들 때 유효 사용 권한을 설정하지 않으려합니다. 허용 확인란을 선택하기 위해서만 설정하려고합니다.과수원 CMS에서 유효 사용 권한을 제거하는 방법

"사이트 소유자 권한"을 선택하면 모든 유효한 체크 박스가 자동으로 선택됩니다. 나는 Effective selection을 선택하고 싶지 않다.

첨부 된 이미지를 참조하십시오.

역할 효과적인 체크 박스 이미지 :

enter image description here

내가 잘못된 일을 할 수있는 것에 대한 어떤 제안? 감사.

+2

사이트 소유자 권한은 가장 강력한 것입니다. 각 설정을 세부적으로 제어하려면 해당 권한을 확인하지 마십시오. – Xceno

+0

실제로 나는 다른 것을 확인하지 않았습니다. 사이트 소유자 권한 확인란의 선택 만 확인합니다. 다른 사람들은 내가 확인하지 않았다. 효과적인 체크 박스는 사이트 소유자 권한에 따라 선택됩니다. –

+0

그렇다면 왜 그 역할에 대한 사이트 소유자 권한을 확인 했습니까? –

답변

1

각 모듈은 자신의 권한이고 유효 권한은 권한 정의에 따라 결정된다 정의 할 수 있습니다 :

http://docs.orchardproject.net/en/latest/Documentation/Custom-permissions/

오차드 그렇게 ImpliedBy permissions 전화 지원도 무엇이든 할 수 Administator 역할과 같은 물건이 하드 코딩되어있다.

나도이 문제로 고생하고 난 하드 코딩 된 Administator 역할 처리를 방지하기 위해 사용자 정의 인증 이벤트 핸들러를 사용하여 그것을 해결 :

public abstract class ExplicitPermissionAuthorizationEventHandler : Orchard.Security.IAuthorizationServiceEventHandler 
{ 
    // public 
    public ExplicitPermissionAuthorizationEventHandler(Orchard.Data.IRepository<Orchard.Roles.Models.UserRolesPartRecord> aUserRolesPartRecords) 
    { 
     mUserRolesPartRecords = aUserRolesPartRecords; 
    } 

    public void Checking(Orchard.Security.CheckAccessContext aContext) {} 
    public void Adjust(Orchard.Security.CheckAccessContext aContext) {} 

    public void Complete(Orchard.Security.CheckAccessContext aContext) 
    { 
     if (aContext.Granted && IsModulePermission(aContext.Permission) && aContext.User != null) 
     { 
     var lIsAdministrator = mUserRolesPartRecords.Fetch(r => r.UserId == aContext.User.ContentItem.Id && r.Role.Name == "Administrator").Any(); 

     if (lIsAdministrator) 
     { 
      // check whether permission is explicitly assigned as Orchard grants all permissions by default when user is in role "Administrator" 

      var lHasPermissionExplicitly = mUserRolesPartRecords.Fetch(r => r.UserId == aContext.User.ContentItem.Id && 
      r.Role.RolesPermissions.Any(p => p.Permission.FeatureName == ModuleName && p.Permission.Name == aContext.Permission.Name)).Any(); 

      if (!lHasPermissionExplicitly) 
      aContext.Granted = false; 
     } 
     } 
    } 

    // protected 
    protected abstract bool IsModulePermission(Orchard.Security.Permissions.Permission aPermission); 
    protected abstract string ModuleName { get; } 

    // private 
    private Orchard.Data.IRepository<Orchard.Roles.Models.UserRolesPartRecord> mUserRolesPartRecords; 
} 

이 당신에게 어떻게 인증 처리기를 사용하는 아이디어를 얻을 것이다.