[ https://issues.apache.org/jira/browse/ACCUMULO-1632?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Josh Elser updated ACCUMULO-1632: --------------------------------- Fix Version/s: (was: 1.7.0) 1.8.0 > Create security policy interface for user-initiated operations > -------------------------------------------------------------- > > Key: ACCUMULO-1632 > URL: https://issues.apache.org/jira/browse/ACCUMULO-1632 > Project: Accumulo > Issue Type: Improvement > Reporter: Christopher Tubbs > Assignee: Christopher Tubbs > Fix For: 1.8.0 > > Original Estimate: 504h > Remaining Estimate: 504h > > This may be a bit ambitious for 1.6.0, but perhaps for 1.7.0. > I think it would be a significant improvement to create a policy-based system > for deciding whether users have permissions to perform actions on the > server-side, rather than explicitly force one implementation of a security > policy based on permissions attributes a user has. > Currently, the "policy" for whether a user can perform certain actions is > hard-coded in the ClientServiceHandler on the server-side, and is based on > the responses it gets from authenticating a user, and retrieving permissions > attributes from a permissions handler. > This code is not centralized, and it makes it difficult to understand not > only what permissions a user is required to have in order to perform an > action, but also which permissions we intended a user to have in order to > perform that action. This makes it very difficult to unit test the security > policy and verify correctness (we do manage, with comprehensive integration > tests, though). > The basic policy interface might look something like: > {code:java} > public interface ActionPolicy { > public boolean canPerformAction(User user, Action action); > } > {code} > Our current permissions-based policy might look like: > {code:java} > public class UserAttributePolicy { > public boolean canPerformAction(User user, Action action) { > if (!user.isAuthenticated()) > return false; > if (action instanceof ReadTableAction) { > return user.hasAttribute("TablePermission.READ:" + ((ReadTableAction) > action).getTableId()); > } > ... > log.warn("User initiated unrecognized Action type " + action.getClass()); > return false; > } > } > {code} > A wrapper for User might be useful, that ties in the different pluggable > components introduced in ACCUMULO-259. Something like: > {code:java} > public final class User { > // constructor > public User(Authenticator authenticator, Authorizor authorizor, > PermissionsHandler permsHandler) { > authenticator.authenticate(this); > ... > } > public Set<String> getAttributes() {...} > public boolean isAuthenticated() {...} > } > {code} > My mockup of User indicates I'd rather see Authorizor and PermissionsHandler > treated as a single user attribute service. I haven't worked through all the > details yet, but I think this would be a lot better for testing, maintenance, > modular configurability, and interoperability. -- This message was sent by Atlassian JIRA (v6.3.4#6332)