Thanks for your quick reply. It seems that I have to implement something like PentahoSecurityAwareConnectionManager in order
public class CustomRoleProcessor implements IConnectionProcessor {
private final static Logger logger = Logger.getLogger(CustomRoleProcessor.class);
public ISaikuConnection process(ISaikuConnection con) {
if (con != null && ISaikuConnection.OLAP_DATASOURCE.equals(con.getDatasourceType())
&& con.getConnection() instanceof OlapConnection) {
OlapConnection olapCon = (OlapConnection) con.getConnection();
try {
RolapConnection rCon = olapCon.unwrap(RolapConnection.class);
if (rCon.getSchema().lookupCube("telephonie", false) != null) {
Role authRole = rCon.getSchema().lookupRole("Authenticated");
if(logger.isDebugEnabled())
logger.debug("rCon.getSchema().lookupRole('Authenticated') ==>" + authRole);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Object principal = auth.getPrincipal();
if(principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
String login = userDetails.getUsername();
if(authRole != null && !login.equals("admin")) {
CustomRoleDelegate customRole = new CustomRoleDelegate(authRole);
rCon.setRole(customRole);
}
}
}
} catch (SQLException e) {
logger.error("Unable to unwrap Olap connection", e);
}
}
return con;
}
}
public class CustomRoleDelegate extends DelegatingRole { private final static Logger logger = Logger.getLogger(CustomRoleDelegate.class); private static String HIERARCHY_NAME = "equipes"; private static String GrantAll = "ALL"; private String agence; private String collaborateur; public CustomRoleDelegate(Role role) { super(((RoleImpl) role).makeMutableClone()); Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Object principal = auth.getPrincipal(); if(principal instanceof UserDetails) { UserDetails userDetails = (UserDetails) principal; String login = userDetails.getUsername(); logger.warn("User logged in for CustomRoleDelegate : " + login); if("smith".equalsIgnoreCase(login)) { this.agence = "Paris Haussmann"; this.collaborateur = "Eric"; } else if("wesson".equalsIgnoreCase(login)) { this.agence = "Paris Haussmann"; this.collaborateur = GrantAll; } } }
@Override public HierarchyAccess getAccessDetails(Hierarchy hierarchy) { HierarchyAccess ha = super.getAccessDetails(hierarchy); return (ha == null ? null : new CustomHierarchyAccess(ha)); }
protected class CustomHierarchyAccess extends RoleImpl.DelegatingHierarchyAccess { public CustomHierarchyAccess(HierarchyAccess ha) { super(ha); }
public Access getAccess(Member member) { return CustomRoleDelegate.this.getAccess(member, hierarchyAccess.getAccess(member)); } }
@Override public Access getAccess(Hierarchy hierarchy) { return role.getAccess(hierarchy); }
@Override public Access getAccess(Member member) { return getAccess(member, role.getAccess(member)); }
protected Access getAccess(Member member, Access access) { String memberHierarchyName = member.getHierarchy().getName(); if (memberHierarchyName.contains(HIERARCHY_NAME)) { if (member.getUniqueName().equalsIgnoreCase("[equipe].[equipes].[" + this.agence + "].[" + this.collaborateur + "]")) { return Access.ALL; } if (member.getUniqueName().equalsIgnoreCase("[equipe].[equipes].[" + this.agence + "]") && this.collaborateur == GrantAll) { return Access.ALL; } for (Member mem : member.getAncestorMembers()) { if (mem.getUniqueName().equalsIgnoreCase("[equipe].[equipes].[" + this.agence + "]") && this.collaborateur == GrantAll) { return Access.ALL; } } Access acc = (access == Access.CUSTOM) ? access : Access.NONE; return acc; } return access; }
@Override public Access getAccess(Level level) { return role.getAccess(level); }}