On 11/25/05, Craig McClanahan <[EMAIL PROTECTED]> wrote:
> On 11/25/05, Ryan Wynn <[EMAIL PROTECTED]> wrote:
> >
> > On 11/25/05, Craig McClanahan <[EMAIL PROTECTED]> wrote:
> > > On 11/25/05, Ryan Wynn <[EMAIL PROTECTED]> wrote:
> > > >
> > > > I was doing some work on enabling declarative component level render
> > > > permissions alongside shale-clay.  What I came up with was to use the
> > > > postProcessCreateComponent pluggable command in clay's chain.  In this
> > > > command I check the current component for an attribute called
> > > > 'renderIfRoleIn'.  This attribute is designed to be a comma delimited
> > > > list of user roles.  I then check if the user's role is in this list
> > > > using request.isUserInRole(nextRole); if not I set the rendered
> > > > property of the component to false.
> > > >
> > > > I was thinking this might be something that could be useful at a shale
> > > > or clay level.  If not at that level then maybe a shale-xxx.jar
> > > > plugin.  Any thoughts?
> > > >
> > > > Ryan
> > >
> > >
> > > Interesting idea ... but I wonder if we are trying to bury too much
> > logic in
> > > the view tier with this approach?
> > >
> > > I'm just thinking that the next person who comes along will say "it's
> > not
> > > just user roles that matter for me, it's whether the user is the manager
> > of
> > > a particular department whose detailed information I'm about to display"
> > --
> > > a concept that I would not assume is represented as an explicit role (in
> > > terms of container managed security constraints).
> > >
> > > Wouldn't it be more general to just bind the rendered property of the
> > > component to a boolean function in your backing bean, which did the
> > > appropriate calculations?  One could certainly write some simple utility
> > > functions that did lookups based on arbitrary sets of roles (which would
> > > have to be encoded into the component somehow), or perhaps better would
> > be a
> > > set of predefined methods for all the interesting combinations
> > (isManager(),
> > > isUser(), isLoggedOn(), ...).  The implementations of these methods can
> > > implement whatever state checking is relevant, which may include roles
> > but
> > > may also include checking other information -- and these sorts of nitty
> > > gritty details are not something the page author should have to be
> > worried
> > > about.
> > >
> > > Craig
> > >
> > >
> >
> > Yeah, I agree with you Craig, it will invevitably become more complex.
> > I just thought that a good percentage of the cases with be based
> > simply on explicit roles.
> >
> > For these more complex cases it might be nice to be able to plug into
> > an existing chain that is designated for this rendering purpose.  For
> > example the default behavior of the chain is to keep the rendered
> > property as-is.  But if the user plugs in a chain at a specific entry
> > point then rendered could be overriden.
> >
> > For example in your scenario, it might be nice to be able to
> > 'chainize' in commands the isManager, isManagerOfDepartmentX,
> > isViewingDataX requirments.  Only to benefit from the separation of
> > concerns that chain offers.
> >
> > I guess from the framework point of view I would be asking to consider
> > an entry point.
>
>
> I guess here is where I'm wondering why we need a framework to accomplish
> this at all, given what JSF already provides?  Consider something like this,
> using JSP syntax:
>
>    <h:panelGrid ... rendered="#{
> securityChecks.managerOfAppropriateDepartment}">
>        ... components to conditionally display ...
>    </h:panelGrid>
>
> Of course, if you were using Clay, you'd use some defined equivalent of
> <h:panelGrid>.  But the key point is that you don't *have* to resolve all
> the attributes to literal values as part of the "configure the rendered
> components" process that Clay does when it parses the template ... simply
> pass on the value binding expression on, so that it gets evaluated by the
> component itself when the time is right.  The
> isManagerOfAppropriateDepartnement() method would check the departmentId
> field of the Manager bean against the department id of the department you're
> trying to display info for (so the method itself takes no parameters).
>
> This way, you can localize your security checks into a managed bean (or make
> it the page bean that corresponds to the page, if the issues are unique to
> that page), with the full capability to configure the security bean's
> behavior through managed bean property settings.
>
> This strategy also works well for both JSP and Clay presentation
> technologies, so you can use either (or both) in your application, as you
> choose.
>
> Thanks,
> > Ryan
> >
>
> Craig
>
>

I see what you mean.  No sense in reinventing the wheel.  I can always
have my managed bean properties be proxies to chains if I wanted to
use the design features that chain offers.

so my isManagerOfAppropriateDepartment() would lookup the
isManagerOfAppropriateDepartment catalog and that would execute
isManager and isAppropriateDepartment commands passing a suitable
Context.

Thanks.

Reply via email to