All right. I'll make a patch this weekend. On Thu, Dec 11, 2008 at 10:21 PM, Ayende Rahien <[email protected]> wrote:
> Yes, so in this case, you are right.What we need to do is to change the > name of the method to GetGlobalPermissionsFor > > > On Thu, Dec 11, 2008 at 3:33 PM, Bart Reyserhove < > [email protected]> wrote: > >> I ask the question: IsAllowed(IUser user, string operation) >> I checked where GetPermissionsFor(IUser user, string operationName) is >> used and it is used in the following two methods: >> >> /// <summary> >> /// Determines whether the specified user is allowed to perform the >> /// specified operation on the entity. >> /// </summary> >> /// <param name="user">The user.</param> >> /// <param name="operation">The operation.</param> >> /// <returns> >> /// <c>true</c> if the specified user is allowed; otherwise, >> <c>false</c>. >> /// </returns> >> public bool IsAllowed(IUser user, string operation) >> { >> Permission[] permissions = permissionsService.GetPermissionsFor(user, >> operation); >> if (permissions.Length == 0) >> return false; >> return permissions[0].Allow; >> } >> >> /// <summary> >> /// Gets the authorization information for the specified user and >> operation, >> /// allows to easily understand why a given operation was granted / >> denied. >> /// </summary> >> /// <param name="user">The user.</param> >> /// <param name="operation">The operation.</param> >> /// <returns></returns> >> public AuthorizationInformation GetAuthorizationInformation(IUser user, >> string operation) >> { >> AuthorizationInformation info; >> if (InitializeAuthorizationInfo(operation, out info)) >> return info; >> Permission[] permissions = permissionsService.GetPermissionsFor(user, >> operation); >> AddPermissionDescriptionToAuthorizationInformation<object>(operation, >> info, user, permissions, null); >> return info; >> } >> >> Both methods above do not take the entity into accoutn since the entity is >> not passed. >> >> I understand that you have to take the situation into account where the >> permission is directly given on the entity but shouldn't I use >> IsAllowed<TEntity>(IUser >> user, TEntity entity, string operation) where TEntity : class then? >> >> Bart >> >> >> On Thu, Dec 11, 2008 at 4:56 PM, Ayende Rahien <[email protected]> wrote: >> >>> What question are you asking? >>> Get permissions isn't actually that useful for the user, it is the >>> question that you ask when you want to know if it has a permission to do X >>> on anything. Anything include entities group. >>> The question that you are likely asking is IsAllowed(), and in this case, >>> I think that you are correct, if it is allowed to do this in general, it is >>> allowed to do so. >>> The problem is that I am not sure that your solution is the appropriate >>> one. >>> GetPermissionsFor is used by the Rhino Security infrastructure, and we >>> need to review this to make sure it doesn't break things. >>> For that matter, we also need to handle the case where a permission was >>> given directly on an entity. >>> >>> >>> On Thu, Dec 11, 2008 at 3:18 AM, Bart Reyserhove < >>> [email protected]> wrote: >>> >>>> The "PermissionsService" contains the following method: >>>> /// <summary> >>>> /// Gets the permissions for the specified etntity >>>> /// </summary> >>>> /// <param name="user">The user.</param> >>>> /// <param name="operationName">Name of the operation.</param> >>>> /// <returns></returns> >>>> public Permission[] GetPermissionsFor(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()))) >>>> >>>> .CreateAlias("Operation", "op") >>>> .Add(Expression.In("op.Name", operationNames)); >>>> >>>> return FindResults(criteria); >>>> } >>>> >>>> This method returns all permissions for a user for a certain operation. >>>> With "All" I mean also the ones that are defined on entitiesgroups. I have >>>> for example an operation "/Department/List" with the permission "on >>>> everything" set to "allow" and with the permission on group "departments of >>>> company x" set on "deny". Now if the user wants to access the " >>>> http://localhost/Department/List" it is not allowed because >>>> Rhino.Security finds a "deny" permission for a certain entitiesgroup. In my >>>> opinion it should not take the permissions on entititiesgroups into account >>>> in this case. It could also be that I have configured it in the wrong way >>>> of >>>> course. >>>> >>>> This fixed it for me: >>>> >>>> /// <summary> >>>> /// Gets the permissions for the specified etntity >>>> /// </summary> >>>> /// <param name="user">The user.</param> >>>> /// <param name="operationName">Name of the operation.</param> >>>> /// <returns></returns> >>>> public Permission[] GetPermissionsFor(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")) >>>> .CreateAlias("Operation", "op") >>>> .Add(Expression.In("op.Name", operationNames)); >>>> >>>> return FindResults(criteria); >>>> } >>>> >>>> Bart >>>> >>>> >>>> >>>> >>> >>> >>> >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Rhino Tools Dev" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rhino-tools-dev?hl=en -~----------~----~----~----~------~----~------~--~---
