[ 
https://issues.apache.org/jira/browse/FC-235?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Shawn McKinney resolved FC-235.
-------------------------------
    Resolution: Fixed

> Add support for runtime constraints to be placed on activated roles
> -------------------------------------------------------------------
>
>                 Key: FC-235
>                 URL: https://issues.apache.org/jira/browse/FC-235
>             Project: FORTRESS
>          Issue Type: Improvement
>    Affects Versions: 2.0.0
>            Reporter: Shawn McKinney
>            Assignee: Shawn McKinney
>            Priority: Major
>             Fix For: 2.0.1
>
>
> h3. *Rationale for change*
> One of the advantages of RBAC is the concept of an activated role.  It allows 
> us to limit when a particular role can be used within a session. 
> For example, temporal constraints, place limits on when a role can be 
> activated based on time and date of the runtime environment.
> This enhancement expands that capability to other types of instance data like 
> location or project.  This will help reduce the number of roles that have to 
> be created.  Now, we won't have to have a teller role for every branch.  
> Rather one teller role will be created, and every user will store properties 
> that control which branch that role can be used in.
> The idea here is to not limit to just a branch constraint rather allow 
> flexibility of the types of instance data that can be used.
> Fortunately, most of what is needed to add these types of controls is already 
> present in the fortress core. The combination of configuration properties and 
> user properties can be used to store the policies.
> h3. *example scenario*
> h3. Role (properties)
> Globally we'll store as config elements the name of each role to be 
> constraint along with the name of the type of constraint.  It will be a 
> trigger for the role activation process to perform special validation.
> admin:location
> manager:location
> servicerep:location
> h3. *Users*:
> Each user, in addition to their typically role assignments, will store 
> properties that define the constraint value for when that role may be 
> applied.  Here we're using location constraints, so each role assignment on 
> the user (constrained in this way) must also have a corresponding property 
> that specifies where that role may be used.
>  
> *curly*
> roles assigned : admin, manager, servicerep
> props: admin:123, manager:456, servicerep:789
> *larry*
> roles assigned : manager
> props: manager:789
> *moe*
> roles assigned : servicerep
> servicerep:123
>  
> Intuitively we can look at these properties and see what's going on.  
> Globally, the implementation defines which roles to be constrained, and what 
> the constraint type is.  In this case a locale type constraint.  Next, we can 
> see what location each user may activate their assigned roles.  Curly is the 
> most powerful of the three, and can activate all three roles, albeit 
> contrained within one locale each.  Larry can only activate his manager role 
> in location 789 while Moe can activate as a servicerep only in location 123.
>  
> These constraints are evaluated during the createSession role activation 
> phase.  The caller specifies which location the user is in by pushing into 
> the runtime as a property on the inbound user object. 
> So if our runtime is at location 123, they will push this in:
> User inUser = new User("curly");
> inUser.setProperty("location", "123");
> Before calling createSession.  Now the validation routine simply has to make 
> sure that every target role being activated is checked against the constraint 
> value. 
> h2. Validation Code
>     /**
>  * This class performs dynamic constraint validation on role per FC-235
>  *
>  * @author <a href="mailto:[email protected]";>Apache Directory 
> Project</a>
>  */
> public class Discriminant
>     implements Validator
> {
>     /**
>      * This method is called during entity activation, \{@link 
> org.apache.directory.fortress.core.util.VUtil#validateConstraints} and 
> ensures role has a
>      * matching constraint value.
>      *
>      * @param session    Contains the discriminant name and value, passed by 
> the caller, along with their corresponding values, as user properties.
>      * @param role only the name is used on this.
>      * @param time       contains the current time stamp which is not needed 
> here.
>      * @param type       here it is used as this validator should not be 
> applied to a user.
>      * @return '0' if validation succeeds else \{@link 
> org.apache.directory.fortress.core.GlobalErrIds#ACTV_FAILED_DISCRIMINANT} if 
> failed.
>      */
>     @Override
>     public int validate(Session session, Constraint role, Time time, 
> VUtil.ConstraintType type )
>     {
>         int rc = 0;
>         // Doesn't make sense to apply this constraint on a user:
>         if ( type != VUtil.ConstraintType.USER )
>         {
>             // This constraint type requires a global config parameter keyed 
> by the role name:
>             String constraintType = Config.getInstance().getProperty( 
> role.getName() );
>             // Is there a runtime constraint placed on this role activation?
>             if ( StringUtils.isNotEmpty( constraintType ))
>             {
>                 // Get the constraint value for this user set as property on 
> the user entity keyed with the role's name:
>                 String userProp = session.getUser().getProperty( 
> role.getName() );
>                 // Does the user have one set?
>                 if ( StringUtils.isNotEmpty( userProp ) )
>                 {
>                     // This value must be placed here by the caller:
>                     String constraintValue = session.getUser().getProperty( 
> constraintType );
>                     // Verify the role's corresponding property value matches 
> the value passed in by the caller of this function.
>                     if ( !userProp.equalsIgnoreCase( constraintValue ) )
>                     {
>                         rc = GlobalErrIds.ACTV_FAILED_DISCRIMINANT;
>                     }
>                 }
>                 else
>                 {
>                     // This user does not have a corresponding property 
> applied to a role that has a runtime constraint set.
>                     rc = GlobalErrIds.ACTV_FAILED_DISCRIMINANT;
>                 }
>             }
>         }
>         return rc;
>     }
> }



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to