Applied with a minor change to make this pass:
[Test]
public void
WillReturnTrueOnGlobalIfPermissionWasAllowedOnGlobalButDeniedOnSpecificEntity()
{
permissionsBuilderService
.Allow("/Account/Edit")
.For(user)
.OnEverything()
.DefaultLevel()
.Save();
UnitOfWork.Current.TransactionalFlush();
permissionsBuilderService
.Deny("/Account/Edit")
.For(user)
.On(account)
.DefaultLevel()
.Save();
UnitOfWork.Current.TransactionalFlush();
bool IsAllowed = authorizationService.IsAllowed(user,
"/Account/Edit");
Assert.IsTrue(IsAllowed);
}
On Sat, Dec 13, 2008 at 5:14 PM, Bart Reyserhove
<[email protected]>wrote:
> Patch attached.
> I also added two new tests and changed the expectation of the one discussed
> earlier in this thread.
>
> Bart
>
>
> On Fri, Dec 12, 2008 at 11:59 PM, Ayende Rahien <[email protected]> wrote:
>
>> I think that this is a test that should be expected to fail after this
>> change.
>>
>>
>> On Fri, Dec 12, 2008 at 11:30 PM, Bart Reyserhove <
>> [email protected]> wrote:
>>
>>> So I changed this 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);
>>> }
>>>
>>> into:
>>>
>>> /// <summary>
>>> /// Gets the global permissions without taking groups into account
>>> /// </summary>
>>> /// <param name="user">The user.</param>
>>> /// <param name="operationName">Name of the operation.</param>
>>> /// <returns></returns>
>>> 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"))
>>> .CreateAlias("Operation", "op")
>>> .Add(Expression.In("op.Name", operationNames));
>>>
>>> return FindResults(criteria);
>>> }
>>>
>>> I added a test for it and I ran all tests. Two tests are failing now, but
>>> it is actually only one case since it is tested for NHibernate and
>>> ActiveRecord.
>>>
>>> The failing test:
>>>
>>> [Test]
>>> public void
>>> ExplainWhyAllowedIfPermissionWasGrantedToUsersGroupAssociatedWithUser()
>>> {
>>> permissionsBuilderService
>>> .Allow("/Account/Edit")
>>> .For("Administrators")
>>> .On("Important Accounts")
>>> .DefaultLevel()
>>> .Save();
>>> UnitOfWork.Current.TransactionalFlush();
>>> AuthorizationInformation information =
>>> authorizationService.GetAuthorizationInformation(user,
>>> "/Account/Edit");
>>> string expected =
>>> @"Permission (level 1) for operation '/Account/Edit' was
>>> granted to group 'Administrators' on 'Important Accounts' ('Ayende' is a
>>> member of 'Administrators')
>>> ";
>>> Assert.AreEqual(expected, information.ToString());
>>> }
>>>
>>> Knowing the change this is quite logic, because in this test the
>>> permission is only granted to a group and checked globally. Functionally
>>> seen you could discuss about this. Permission was only granted to the
>>> "Important accounts" and the question is "OnEverything". So one could argue
>>> that it is correct that the permission is not granted, but of course this
>>> could lead to breaking changes...
>>>
>>> What's your opinion?
>>>
>>> Bart
>>>
>>>
>>> On Fri, Dec 12, 2008 at 8:27 AM, Bart Reyserhove <
>>> [email protected]> wrote:
>>>
>>>> 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
-~----------~----~----~----~------~----~------~--~---