Hi Nikhil, Good to hear, thanks for the feedback.
I think that the Apache Isis security module is great.


On Tue, Dec 12, 2017 at 8:27 PM, Patrick Pliessnig <p.pliess...@gmail.com>
wrote:

> :-)
>
> Am 12.12.2017 8:39 vorm. schrieb "Nikhil Dhamapurkar" <
> nikhil.dhamapur...@healthengine.com.au>:
>
> > Hi Patrick, Steve
> >
> > Thank for your responses, I have made the changes similar to what you
> guys
> > have suggested.
> > The context relating to desk / Org  was helpful.
> >
> > I have flattened the many to many relation entity  (practicePractitioner)
> > which relates a practice and a patient, the admin or a super user will
> link
> > a practitioner with a practice in this entity this way not exposing all
> > Practitioners to every user and this entity can have their own version of
> > Practitioner Name or Shortname as well.
> >
> > Also, to relate the Desk / Context instead of extending the
> > ApplicationUser class to save the current login information, I am saving
> > the UserRole and Practice its Organization in a separate table
> > (RoleMapping). I read the role mapping in the ApplicationTenancyEvaluator
> > and Hide or disable the entity based on this information
> >
> > Completed most of the changes yesterday and I can see I have the control
> > as needed for the entity based on these changes thank you for your
> > suggestions.
> >
> > Regards
> > Nikhil
> >
> > From: Patrick Pliessnig
> > Sent: 07 December 2017 11:42
> > To: users@isis.apache.org
> > Subject: Re: Tenancy restriction - entity that relates to more
> > thanoneOtherentity.
> >
> > I wonder whether a metaphor for context could do a better job?
> >
> > Say, 'desk' instead of context. Then the user would have a currentDesk on
> > login
> >
> > To model the desk an interesting question might be, who organizes the
> desk?
> > Is it the practice for more standardization or rather the practitioner
> for
> > more individualization?
> >
> >
> > Am 06.12.2017 11:35 nachm. schrieb "Stephen Cameron" <
> > steve.cameron...@gmail.com>:
> >
> > > Oops, ignore that comment in the Person about tenancy paths, they
> aren't
> > > needed (yet).
> > >
> > > On Thu, Dec 7, 2017 at 9:33 AM, Stephen Cameron <
> > > steve.cameron...@gmail.com>
> > > wrote:
> > >
> > > > Hi Nikil,
> > > >
> > > > The context switching that Patrick is speaking of is what I was
> > > suggesting
> > > > before, but to make this work I think you have to extend the default
> > > > application user and record the current context on your extended
> > > > ApplicationUser. I've just done a test on this for my cooperation
> > > project.
> > > > In my situatioin there is a many-to-many relationship between
> > > Organisation
> > > > and Person, ( I have an OrganisationPerson entity for the join, so
> can
> > > set
> > > > a status property for each, either active or inactive)
> > > >
> > > > So I have a Person that references a current Organisation (context)
> > > >
> > > > @PersistenceCapable(identityType = IdentityType.DATASTORE, schema =
> > > > "cooperation")
> > > > @Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
> > > > @DomainObject()
> > > > public class Person extends ApplicationUser {
> > > >
> > > >     /*
> > > >      * Allow a default Organisation to be set on the current user.
> > > >      *
> > > >      * Organisations have a list of linked users/Persons, but one
> user
> > > > might link to
> > > >      * multiple Organisations, but we want to restrict the visibility
> > to
> > > > one Organisation at a time.
> > > >      *
> > > >      * We restrict access to all data usinf the security module
> tenancy
> > > > path, but this requires
> > > >      * a current Organisation, that is set here a login, by the user
> > > > having only one link to an
> > > >      * Organisation, or, the user selecting one specifically. In the
> > > later
> > > > case the currently operating
> > > >      * one will be saved from session to session.
> > > >      *
> > > >      */
> > > >     @Column(allowsNull="true", name="organisation_id")
> > > >     @Getter
> > > >     @Setter(value=AccessLevel.PACKAGE)
> > > >     private Organisation organisation;
> > > >
> > > > ...
> > > >
> > > > }
> > > >
> > > > Person is used by the security module instead of default
> > ApplicationUser
> > > > by having a domain service as follows:
> > > >
> > > > @DomainService(nature=NatureOfService.DOMAIN)
> > > > public class MyApplicationUserFactory implements
> > ApplicationUserFactory {
> > > >
> > > >     @Override
> > > >     public ApplicationUser newApplicationUser() {
> > > >         final ApplicationUser object = new Person();
> > > >         serviceRegistry.injectServicesInto(object);
> > > >         return object;
> > > >     }
> > > >
> > > >     @javax.inject.Inject
> > > >     RepositoryService repositoryService;
> > > >     @javax.inject.Inject
> > > >     ServiceRegistry2 serviceRegistry;
> > > > }
> > > >
> > > > Then to control what Organisation a person can see at any one time I
> > > have:
> > > >
> > > > @DomainService(nature = NatureOfService.DOMAIN)
> > > > public class TenancyPathEvaluatorForCooperation implements
> > > > ApplicationTenancyEvaluator {
> > > >     @Override
> > > >     public boolean handles(final Class<?> cls) {
> > > >         return Organisation.class == cls;
> > > >     }
> > > >
> > > >     @Override
> > > >     public String disables(Object arg0, ApplicationUser arg1) {
> > > >         return null;
> > > >     }
> > > >
> > > >     @Override
> > > >     public String hides(Object arg0, ApplicationUser arg1) {
> > > >         if (((Organisation) arg0).equals(((Person)
> > > > arg1).getOrganisation()))
> > > >             return null;
> > > >         else
> > > >             return "Organisation access prevented";
> > > >     }
> > > > }
> > > >
> > > >
> > > > Note: This has yet to be extended to handle all classes that are
> linked
> > > to
> > > > an Organisation!
> > > >
> > > > One thing I  have not done is to allow a user to switch their
> > > Organisation
> > > > context, this is simply done by presenting a list of Organisations
> > based
> > > on
> > > > the list of OrganisationPerson entities that reference their Person
> > > entity,
> > > > which is what the security module returns as the logged in user. I
> > think
> > > > this is how this should be accessed:
> > > >
> > > > Person user = (Person) userRepo.findByUsernameCached(
> > > > users.getUser().getName());
> > > >
> > > > @Inject
> > > > ApplicationUserRepository userRepo;
> > > > @Inject
> > > > UserService users;
> > > >
> > > > Steve
> > > >
> > > >
> > > >
> > > > On Thu, Dec 7, 2017 at 2:33 AM, Patrick Pliessnig <
> p.pliess...@gmx.net
> > >
> > > > wrote:
> > > >
> > > >> Hi Nikhil
> > > >>
> > > >> This note is not about tenancy but about domain model.
> > > >>
> > > >> It seems to me that your practitioners (users) switch contexts
> > according
> > > >> to their current needs. Such a context could define the practice
> which
> > > is
> > > >> used to filter patients or it could define a location out in the
> > > outback if
> > > >> it is a flying doctor. In the case of a location the context
> defines a
> > > >> collection of local practices to filter patients.
> > > >>
> > > >> If you model contexts as domain entities you could use them to
> filter
> > > the
> > > >> patients the way you want. The practitioner could create his own
> > > contexts
> > > >> and everytime he logs in he activates the context he needs or the
> last
> > > >> activated context is used. If he then wants to list all patients
> only
> > > the
> > > >> patients filtered by the active context are shown.
> > > >>
> > > >> hth
> > > >> Patrick
> > > >>
> > > >>
> > > >>
> > > >> Am 06.12.2017 um 15:07 schrieb Nikhil Dhamapurkar:
> > > >>
> > > >>> I have made some progress in implementing tenancy, I would like to
> > know
> > > >>> if there is a better way someone has tried to use Tenancy interface
> > > >>> ApplicationTenancyEvaluator to apply on embedded Collections ?
> > > >>>
> > > >>> Example:
> > > >>> Patient has many to many relationship with practice  how  can I
> best
> > > >>> Hide or Disable Practice that should not be shown to the logged in
> > user
> > > >>> when he views Patient?
> > > >>> Patient  ←→ Practice  ( many to many)
> > > >>>
> > > >>> Regards
> > > >>> Nikhil
> > > >>>
> > > >>> From: Nikhil Dhamapurkar
> > > >>> Sent: 01 December 2017 11:27
> > > >>> To: users@isis.apache.org
> > > >>> Subject: RE: Tenancy restriction - entity that relates to more than
> > > >>> oneOtherentity.
> > > >>>
> > > >>> Hi Steve, Patrick
> > > >>>
> > > >>> As Steve suggested I had a table where I had Practice to Role
> mapping
> > > >>> instead of user as one of the use case is to see all Patients
> > > belonging to
> > > >>> a role / Org which if we switch user and Practice we wont see all
> > > patients
> > > >>> belonging to an org but my approach can display or restrict based
> on
> > > one
> > > >>> role if the user belongs to more than one role hence its not
> entirely
> > > >>> useful as well.
> > > >>>
> > > >>> Based on the input I am planning to make below changes :
> > > >>>
> > > >>> As Patrick has suggested I will be creating an entity  Patient (
> > > >>> PatientInternalDetails, PracticePatients)     - internal details as
> > > things
> > > >>> like Medical records etc.
> > > >>> PracticePatients will have  additional fields which are Ok to be
> > > >>> displayed to user with permissions, and we have taken a call that
> > > entity
> > > >>> Patient is Ok to be visible only to admin users ( say “/”).
> > > >>>
> > > >>> Also will be exploring : https://isis.apache.org/guides
> > > >>> /rgcms/rgcms.html#_rgcms_classes_super_AbstractViewModel
> > > >>> If I can make changes in view instead of Domain Model.
> > > >>>
> > > >>> Regards
> > > >>> Nikhil
> > > >>>
> > > >>> From: Stephen Cameron
> > > >>> Sent: 01 December 2017 03:37
> > > >>> To: users@isis.apache.org
> > > >>> Subject: Re: Tenancy restriction - entity that relates to more than
> > one
> > > >>> Otherentity.
> > > >>>
> > > >>> Or, maybe just switching the role and setting a practice value
> after
> > > >>> logging in, then you have to switch the role back to the simple
> > 'login'
> > > >>> one
> > > >>> on logout, so that the next time they login they'll see that simple
> > > >>> practice selection menu again.
> > > >>>
> > > >>> On Fri, Dec 1, 2017 at 7:49 AM, Stephen Cameron <
> > > >>> steve.cameron...@gmail.com>
> > > >>> wrote:
> > > >>>
> > > >>> I think that making use of a custom ApplicationUser (explained in
> the
> > > >>>> security module notes) with a property practice may be necessary.
> > > >>>>
> > > >>>> Then Practioners would either log in as a specific user depending
> on
> > > >>>> what
> > > >>>> practice they are working at, or you might be able to make a
> switch
> > > >>>> happen
> > > >>>> behind the scenes, such that they always login as one application
> > > user,
> > > >>>> with only 1 menu option allowing them to choose a practice and the
> > > >>>> system
> > > >>>> switches their application user to a practice specific generated
> > user
> > > >>>> with
> > > >>>> a role giving full menu access.
> > > >>>>
> > > >>>>
> > > >>>> On Fri, Dec 1, 2017 at 1:58 AM, Patrick Pliessnig <
> > > >>>> p.pliess...@gmail.com>
> > > >>>> wrote:
> > > >>>>
> > > >>>> Hi Nikhil
> > > >>>>>
> > > >>>>> I guess this ultimately relates to the question how a practice
> > knows
> > > >>>>> about
> > > >>>>> its patients and the related access path.
> > > >>>>>
> > > >>>>> With tenancy the answer is: the patients are the ones with access
> > > >>>>> rights
> > > >>>>> for the practice.
> > > >>>>>
> > > >>>>> Maybe you could use a practice attribute 'practicePatients'. Then
> > the
> > > >>>>> answer is: the patients are the ones that use the services of the
> > > >>>>> practice.
> > > >>>>> (Many to many).
> > > >>>>>
> > > >>>>> Patrick
> > > >>>>>
> > > >>>>>
> > > >>>>> Am 30.11.2017 12:58 nachm. schrieb "Nikhil Dhamapurkar"
> > > >>>>> <nikhil.dhamapurkar@
> > > >>>>> healthengine.com.au>:
> > > >>>>>
> > > >>>>> Hi,
> > > >>>>>
> > > >>>>> I am working on supporting Multi Tenancy in Apache ISIS I have
> > tried
> > > >>>>> both
> > > >>>>> 1) ApplicationTenancyEvaluator and 2) HasAtPath interfaces to
> > control
> > > >>>>> what
> > > >>>>> the  logged in user can see or execute.
> > > >>>>>
> > > >>>>> I have been able to make them work to an acceptable state but I
> > face
> > > >>>>> issue
> > > >>>>> when I come across collections that are part of the entity I am
> > > >>>>> evaluating.
> > > >>>>>
> > > >>>>> My Domain model has Patient  / Practitioner entity both these
> > entity
> > > >>>>> can
> > > >>>>> be
> > > >>>>> associated with Different Practices at the same time.
> > > >>>>>
> > > >>>>>
> > > >>>>> Example :    PractitionerA belongs to PracticeA and PracticeB
> both,
> > > >>>>> logged
> > > >>>>> in User has “Role” to Access PracticeA.
> > > >>>>>
> > > >>>>> Issue with ApplicationTenancyEvaluator : since Practitioner and
> > > >>>>> Practice
> > > >>>>> have many to many relation even if the role has access to only
> one
> > > >>>>> practice
> > > >>>>> I’ll end up displaying PracticeB on wicket viewer which I want to
> > > >>>>> prevent,
> > > >>>>> Is it possible ?
> > > >>>>>
> > > >>>>>
> > > >>>>> Issue with HasAtPath :
> > > >>>>>
> > > >>>>> I am creating  Path programmatically with pattern as :
> > > >>>>> ORG/org/PRACTICE/<practiceName>/  pattern which models a tree,
> > then
> > > I
> > > >>>>> can
> > > >>>>> control user access to more than one Patient data if user at path
> > is
> > > >>>>> /ORG/org Or restrict  access to one practice
> > > >>>>> /ORG/org/PRACTICE/practiceA
> > > >>>>> If the Patient Entity is associated with more than one practice
> My
> > > >>>>> logic
> > > >>>>> will Break as I would not know what should be the context for the
> > for
> > > >>>>> ORG/org/PRACTICE/<WhatShouldBeHere?>
> > > >>>>>
> > > >>>>> Does anyone have a better solution to tackle tenancy for a
> > Collection
> > > >>>>> within an entity?
> > > >>>>>
> > > >>>>> Regards
> > > >>>>> Nikhil
> > > >>>>>
> > > >>>>>
> > > >>>>
> > > >>>
> > > >>>
> > > >>
> > > >
> > >
> >
> >
>

Reply via email to