Refactored permission authorizer module

revert-70aa11f8
milanperera 9 years ago
parent 68befaae01
commit ed937467cd

@ -21,37 +21,40 @@ package org.wso2.carbon.device.mgt.core.config.permission;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Permission") /**
public class Permission{ * This class represents the information related to permission.
*/
@XmlRootElement (name = "Permission")
public class Permission {
private String name; // permission name private String name; // permission name
private String path; // permission string private String path; // permission string
private String url; // url of the resource private String url; // url of the resource
private String method; // http method private String method; // http method
public String getName() { public String getName() {
return name; return name;
} }
@XmlElement(name = "name", required = true) @XmlElement (name = "name", required = true)
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
public String getPath() { public String getPath() {
return path; return path;
} }
@XmlElement(name = "path", required = true) @XmlElement (name = "path", required = true)
public void setPath(String path) { public void setPath(String path) {
this.path = path; this.path = path;
} }
public String getUrl() { public String getUrl() {
return url; return url;
} }
@XmlElement(name = "url", required = true) @XmlElement (name = "url", required = true)
public void setUrl(String url) { public void setUrl(String url) {
this.url = url; this.url = url;
} }
@ -60,7 +63,7 @@ public class Permission{
return method; return method;
} }
@XmlElement(name = "method", required = true) @XmlElement (name = "method", required = true)
public void setMethod(String method) { public void setMethod(String method) {
this.method = method; this.method = method;
} }

@ -22,17 +22,20 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import java.util.List; import java.util.List;
@XmlRootElement(name = "PermissionConfiguration") /**
* This class represents the information related to permission configuration.
*/
@XmlRootElement (name = "PermissionConfiguration")
public class PermissionConfiguration { public class PermissionConfiguration {
private List<Permission> permissions; private List<Permission> permissions;
public List<Permission> getPermissions() { public List<Permission> getPermissions() {
return permissions; return permissions;
} }
@XmlElement(name = "Permission", required = true) @XmlElement (name = "Permission", required = true)
public void setPermissions(List<Permission> permissions) { public void setPermissions(List<Permission> permissions) {
this.permissions = permissions; this.permissions = permissions;
} }
} }

@ -32,96 +32,59 @@ import java.util.StringTokenizer;
*/ */
public class PermissionManager { public class PermissionManager {
private static PermissionManager permissionManager; private static PermissionManager permissionManager;
private static PermissionHolder rootNode; private static PermissionTree permissionTree; // holds the permissions at runtime.
private PermissionManager(){}; private PermissionManager() {
}
public static PermissionManager getInstance() {
if (permissionManager == null) {
synchronized (PermissionManager.class) {
if (permissionManager == null) {
permissionManager = new PermissionManager();
rootNode = new PermissionHolder("/"); // initializing the root node.
}
}
}
return permissionManager;
}
public boolean addPermission(Permission permission) throws DeviceManagementException { public static PermissionManager getInstance() {
StringTokenizer st = new StringTokenizer(permission.getUrl(), "/"); if (permissionManager == null) {
PermissionHolder tempRoot = rootNode; synchronized (PermissionManager.class) {
PermissionHolder tempChild; if (permissionManager == null) {
while(st.hasMoreTokens()) { permissionManager = new PermissionManager();
tempChild = new PermissionHolder(st.nextToken()); permissionTree = new PermissionTree();
tempRoot = addPermissionNode(tempRoot, tempChild); }
}
} }
tempRoot.addPermission(permission.getMethod(), permission); //setting permission to the vertex return permissionManager;
try { }
return PermissionUtils.putPermission(permission);
} catch (DeviceManagementException e) {
throw new DeviceManagementException("Error occurred while adding the permission : " +
permission.getName(), e);
}
}
public boolean addPermissions(List<Permission> permissions) throws DeviceManagementException{
for(Permission permission:permissions){
this.addPermission(permission);
}
return true;
}
public void initializePermissions(InputStream permissionStream) throws DeviceManagementException { public boolean addPermission(Permission permission) throws DeviceManagementException {
try { permissionTree.addPermission(permission); // adding a permission to the tree
if(permissionStream != null){ try {
/* Un-marshaling Device Management configuration */ return PermissionUtils.putPermission(permission);
JAXBContext cdmContext = JAXBContext.newInstance(PermissionConfiguration.class); } catch (DeviceManagementException e) {
Unmarshaller unmarshaller = cdmContext.createUnmarshaller(); throw new DeviceManagementException("Error occurred while adding the permission : " +
PermissionConfiguration permissionConfiguration = (PermissionConfiguration) permission.getName(), e);
unmarshaller.unmarshal(permissionStream); }
if((permissionConfiguration != null) && (permissionConfiguration.getPermissions() != null)){ }
this.addPermissions(permissionConfiguration.getPermissions());
}
}
} catch (JAXBException e) {
throw new DeviceManagementException("Error occurred while initializing Data Source config", e);
}
}
private PermissionHolder addPermissionNode(PermissionHolder parent, PermissionHolder child) { public boolean addPermissions(List<Permission> permissions) throws DeviceManagementException {
PermissionHolder existChild = parent.getChild(child.getPathName()); for (Permission permission : permissions) {
if (existChild == null) { this.addPermission(permission);
parent.addChild(child);
return child;
} }
return existChild; return true;
} }
public Permission getPermission(String url, String httpMethod) { public void initializePermissions(InputStream permissionStream) throws DeviceManagementException {
StringTokenizer st = new StringTokenizer(url, "/"); try {
PermissionHolder tempRoot = rootNode; if (permissionStream != null) {
PermissionHolder previousRoot; /* Un-marshaling Device Management configuration */
while (st.hasMoreTokens()) { JAXBContext cdmContext = JAXBContext.newInstance(PermissionConfiguration.class);
String currentToken = st.nextToken(); Unmarshaller unmarshaller = cdmContext.createUnmarshaller();
previousRoot = tempRoot; PermissionConfiguration permissionConfiguration = (PermissionConfiguration)
tempRoot = tempRoot.getChild(currentToken); unmarshaller.unmarshal(permissionStream);
if (tempRoot == null) { if (permissionConfiguration != null && permissionConfiguration.getPermissions() != null) {
tempRoot = previousRoot; this.addPermissions(permissionConfiguration.getPermissions());
int leftTokens = st.countTokens();
for (int i = 0; i <= leftTokens; i++) {
if (tempRoot == null) {
return null;
}
tempRoot = tempRoot.getChild("*");
} }
break;
} }
} catch (JAXBException e) {
throw new DeviceManagementException("Error occurred while initializing Data Source config", e);
} }
if (tempRoot == null) { }
return null;
} public Permission getPermission(String url, String httpMethod) {
return tempRoot.getPermission(httpMethod); return permissionTree.getPermission(url, httpMethod);
} }
} }

@ -25,15 +25,15 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* This class represents the node of a permission graph. * This class represents the node of a permission tree.
*/ */
public class PermissionHolder { public class PermissionNode {
String pathName; private String pathName;
Map<String, Permission> permissions = new HashMap<String, Permission>(); private Map<String, Permission> permissions = new HashMap<String, Permission>();
List<PermissionHolder> children = new ArrayList<PermissionHolder>(); private List<PermissionNode> children = new ArrayList<PermissionNode>();
public PermissionHolder(String pathName) { public PermissionNode(String pathName) {
this.pathName = pathName; this.pathName = pathName;
} }
@ -45,13 +45,13 @@ public class PermissionHolder {
this.pathName = pathName; this.pathName = pathName;
} }
public List<PermissionHolder> getChildren() { public List<PermissionNode> getChildren() {
return children; return children;
} }
public PermissionHolder getChild(String pathName) { public PermissionNode getChild(String pathName) {
PermissionHolder child = null; PermissionNode child = null;
for (PermissionHolder node : children) { for (PermissionNode node : children) {
if (node.getPathName().equals(pathName)) { if (node.getPathName().equals(pathName)) {
return node; return node;
} }
@ -59,7 +59,7 @@ public class PermissionHolder {
return child; return child;
} }
public void addChild(PermissionHolder node) { public void addChild(PermissionNode node) {
children.add(node); children.add(node);
} }

@ -84,7 +84,7 @@ public class PermissionUtils {
return status; return status;
} }
public static boolean checkPermissionExistance(Permission permission) public static boolean checkPermissionExistence(Permission permission)
throws DeviceManagementException, throws DeviceManagementException,
org.wso2.carbon.registry.core.exceptions.RegistryException { org.wso2.carbon.registry.core.exceptions.RegistryException {
return PermissionUtils.getGovernanceRegistry().resourceExists(permission.getPath()); return PermissionUtils.getGovernanceRegistry().resourceExists(permission.getPath());

@ -29,9 +29,9 @@ import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthen
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
public class PermissionAuthorizerValve extends CarbonTomcatValve { public class PermissionAuthorizationValve extends CarbonTomcatValve {
private static final Log log = LogFactory.getLog(PermissionAuthorizerValve.class); private static final Log log = LogFactory.getLog(PermissionAuthorizationValve.class);
private static final String AUTHORIZATION_ENABLED = "authorization-enabled"; private static final String AUTHORIZATION_ENABLED = "authorization-enabled";
@ -44,7 +44,7 @@ public class PermissionAuthorizerValve extends CarbonTomcatValve {
this.processResponse(request, response, compositeValve, WebappAuthenticator.Status.CONTINUE); this.processResponse(request, response, compositeValve, WebappAuthenticator.Status.CONTINUE);
return; return;
} }
// check whether the permission checking function is enabled // check whether the permission checking function is enabled in web.xml
boolean isEnabled = new Boolean(permissionStatus); boolean isEnabled = new Boolean(permissionStatus);
if (!isEnabled) { if (!isEnabled) {
this.processResponse(request, response, compositeValve, WebappAuthenticator.Status.CONTINUE); this.processResponse(request, response, compositeValve, WebappAuthenticator.Status.CONTINUE);

@ -39,12 +39,11 @@ public class PermissionAuthorizer {
public WebappAuthenticator.Status authorize(Request request, Response response) { public WebappAuthenticator.Status authorize(Request request, Response response) {
// contextOperation is used to get defined operation type from the web.xml
String requestUri = request.getRequestURI(); String requestUri = request.getRequestURI();
String requestMethod = request.getMethod(); String requestMethod = request.getMethod();
if (requestUri == null || requestUri.isEmpty() || if (requestUri == null || requestUri.isEmpty() ||
requestMethod == null || requestMethod.isEmpty()) { requestMethod == null || requestMethod.isEmpty()) {
return WebappAuthenticator.Status.CONTINUE; return WebappAuthenticator.Status.CONTINUE;
} }
@ -61,7 +60,10 @@ public class PermissionAuthorizer {
String permissionString = requestPermission.getPath(); String permissionString = requestPermission.getPath();
// This is added temporarily until authentication works. // This is added temporarily until authentication works.
// TODO remove below line.
String username = "admin"; String username = "admin";
// TODO uncomment this once the authentication works.
//String username = CarbonContext.getThreadLocalCarbonContext().getUsername();
boolean isUserAuthorized; boolean isUserAuthorized;
try { try {

@ -23,7 +23,6 @@ import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext; import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.certificate.mgt.core.service.CertificateManagementService; import org.wso2.carbon.certificate.mgt.core.service.CertificateManagementService;
import org.wso2.carbon.device.mgt.core.scep.SCEPManager; import org.wso2.carbon.device.mgt.core.scep.SCEPManager;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve; import org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve;
import org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer; import org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer;
import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.user.core.service.RealmService;
@ -31,7 +30,7 @@ import org.wso2.carbon.webapp.authenticator.framework.DataHolder;
import org.wso2.carbon.webapp.authenticator.framework.WebappAuthenticationHandler; import org.wso2.carbon.webapp.authenticator.framework.WebappAuthenticationHandler;
import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthenticator; import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthenticator;
import org.wso2.carbon.webapp.authenticator.framework.WebappAuthenticatorRepository; import org.wso2.carbon.webapp.authenticator.framework.WebappAuthenticatorRepository;
import org.wso2.carbon.webapp.authenticator.framework.authorizer.PermissionAuthorizerValve; import org.wso2.carbon.webapp.authenticator.framework.authorizer.PermissionAuthorizationValve;
import org.wso2.carbon.webapp.authenticator.framework.config.AuthenticatorConfig; import org.wso2.carbon.webapp.authenticator.framework.config.AuthenticatorConfig;
import org.wso2.carbon.webapp.authenticator.framework.config.WebappAuthenticatorConfig; import org.wso2.carbon.webapp.authenticator.framework.config.WebappAuthenticatorConfig;
@ -87,7 +86,7 @@ public class WebappAuthenticatorFrameworkServiceComponent {
List<CarbonTomcatValve> valves = new ArrayList<CarbonTomcatValve>(); List<CarbonTomcatValve> valves = new ArrayList<CarbonTomcatValve>();
valves.add(new WebappAuthenticationHandler()); valves.add(new WebappAuthenticationHandler());
valves.add(new PermissionAuthorizerValve()); valves.add(new PermissionAuthorizationValve());
TomcatValveContainer.addValves(valves); TomcatValveContainer.addValves(valves);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {

Loading…
Cancel
Save