Skip to content

Commit 7f0d8d2

Browse files
committed
Merge from Security integration to develop
2 parents 831bb73 + d40ac66 commit 7f0d8d2

File tree

12 files changed

+397
-81
lines changed

12 files changed

+397
-81
lines changed

modules/lsm-light/lsm-light.server/src/main/java/org/openiot/lsm/http/SecurityInitializer.java

+38-9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class SecurityInitializer {
2828
private static final long ID_SDUM = 6;
2929
private static final long ID_REQ_DEF = 7;
3030
private static final long ID_REQ_PRES = 8;
31+
private static final long ID_XGSN = 9;
3132

3233
public static final String ADMIN_USERNAME = "security.initialize.admin.username";
3334
public static final String ADMIN_PASSWORD = "security.initialize.admin.password";
@@ -38,6 +39,8 @@ public class SecurityInitializer {
3839
public static final String SCHEDULER_PASSWORD = "security.initialize.scheduler.password";
3940
public static final String SDUM_USERNAME = "security.initialize.sdum.username";
4041
public static final String SDUM_PASSWORD = "security.initialize.sdum.password";
42+
public static final String XGSN_USERNAME = "security.initialize.xgsn.username";
43+
public static final String XGSN_PASSWORD = "security.initialize.xgsn.password";
4144
public static final String CAS_PREFIX = "security.initialize.cas.prefix";
4245
public static final String MGMT_PREFIX = "security.initialize.management.prefix";
4346
public static final String REQ_DEF_PREFIX = "security.initialize.reqDef.prefix";
@@ -48,9 +51,12 @@ public class SecurityInitializer {
4851
public static final String REQ_DEF_KEY = "security.initialize.reqDef.key";
4952
public static final String REQ_PRES_SECRET = "security.initialize.reqPres.secret";
5053
public static final String REQ_PRES_KEY = "security.initialize.reqPres.key";
51-
52-
public static final String SERVICE_KEY_PREFIX = "casOauthClient.key.";
53-
public static final String SERVICE_SECRET_PREFIX = "casOauthClient.key.";
54+
public static final String SCHEDULER_SECRET = "security.initialize.scheduler.secret";
55+
public static final String SCHEDULER_KEY = "security.initialize.scheduler.key";
56+
public static final String SDUM_SECRET = "security.initialize.sdum.secret";
57+
public static final String SDUM_KEY = "security.initialize.sdum.key";
58+
public static final String XGSN_SECRET = "security.initialize.xgsn.secret";
59+
public static final String XGSN_KEY = "security.initialize.xgsn.key";
5460

5561
private String lSMOauthGraphURL;
5662
private static PropertyManagement props;
@@ -155,7 +161,9 @@ private void generateAuthorizationData() {
155161
predefPermissions.add(new Permission(PermissionsUtil.DEL_SENSOR_MAIN, "delete sensor", ID_LSM_SERVER));
156162
predefPermissions.add(new Permission(PermissionsUtil.DEL_READING_MAIN, "delete sensor reading", ID_LSM_SERVER));
157163
predefPermissions.add(new Permission(PermissionsUtil.DEL_TRIPLES_MAIN, "delete triples", ID_LSM_SERVER));
158-
predefPermissions.add(new Permission(PermissionsUtil.LSM_ALL, "all permissions", ID_LSM_SERVER));
164+
165+
Permission allPermLSMServer = new Permission(PermissionsUtil.LSM_ALL, "all permissions", ID_LSM_SERVER);
166+
predefPermissions.add(allPermLSMServer);
159167

160168
// Pre-defined permissions and roles for scheduler
161169
Permission allPermScheduler = new Permission(PermissionsUtil.SCHEDULER_ALL, "all permissions", ID_SCHEDULER);
@@ -185,6 +193,13 @@ private void generateAuthorizationData() {
185193
md5(props.getProperty(SDUM_PASSWORD, "sdumuserpass")));
186194
addUser(sdumUser);
187195

196+
User xgsnUser = generateUser("XGSN User", "xgsn@openiot.eu", props.getProperty(XGSN_USERNAME, "gsnuser"),
197+
md5(props.getProperty(XGSN_PASSWORD, "gsnpass")));
198+
Role xgsnRoleOnLSM = new Role("xgsn-role", "Default XGSN Role", ID_LSM_SERVER);
199+
xgsnRoleOnLSM.addPermission(allPermLSMServer);
200+
xgsnUser.addRole(xgsnRoleOnLSM);
201+
addUser(xgsnUser);
202+
188203
}
189204

190205
private List<LSMRegisteredServiceImpl> createDefaultServices() {
@@ -249,11 +264,11 @@ private List<LSMRegisteredServiceImpl> createDefaultServices() {
249264
schedulerService.setId(ID_SCHEDULER);
250265
schedulerService.setAllowedToProxy(true);
251266
schedulerService.setAnonymousAccess(false);
252-
schedulerService.setDescription(props.getProperty(SERVICE_SECRET_PREFIX + "scheduler", "scheduler.secret"));
267+
schedulerService.setDescription(props.getProperty(SCHEDULER_SECRET, "scheduler.secret"));
253268
schedulerService.setEnabled(true);
254269
schedulerService.setEvaluationOrder(0);
255270
schedulerService.setIgnoreAttributes(false);
256-
schedulerService.setName(props.getProperty(SERVICE_KEY_PREFIX + "scheduler", "scheduler"));
271+
schedulerService.setName(props.getProperty(SCHEDULER_KEY, "scheduler"));
257272
schedulerService.setServiceId("REST://scheduler");
258273
schedulerService.setTheme("Scheduler");
259274
schedulerService.setSsoEnabled(true);
@@ -263,15 +278,29 @@ private List<LSMRegisteredServiceImpl> createDefaultServices() {
263278
sdumService.setId(ID_SDUM);
264279
sdumService.setAllowedToProxy(true);
265280
sdumService.setAnonymousAccess(false);
266-
sdumService.setDescription(props.getProperty(SERVICE_SECRET_PREFIX + "sdum", "sdum.secret"));
281+
sdumService.setDescription(props.getProperty(SDUM_SECRET, "sdum.secret"));
267282
sdumService.setEnabled(true);
268283
sdumService.setEvaluationOrder(0);
269284
sdumService.setIgnoreAttributes(false);
270-
sdumService.setName(props.getProperty(SERVICE_KEY_PREFIX + "sdum", "sdum"));
285+
sdumService.setName(props.getProperty(SDUM_KEY, "sdum"));
271286
sdumService.setServiceId("REST://sdum");
272287
sdumService.setTheme("SDUM");
273288
sdumService.setSsoEnabled(true);
274289

290+
// XGSN REST service
291+
LSMRegisteredServiceImpl xgsnService = new LSMRegisteredServiceImpl();
292+
xgsnService.setId(ID_XGSN);
293+
xgsnService.setAllowedToProxy(true);
294+
xgsnService.setAnonymousAccess(false);
295+
xgsnService.setDescription(props.getProperty(XGSN_SECRET, "xgsn.secret"));
296+
xgsnService.setEnabled(true);
297+
xgsnService.setEvaluationOrder(0);
298+
xgsnService.setIgnoreAttributes(false);
299+
xgsnService.setName(props.getProperty(XGSN_KEY, "xgsn"));
300+
xgsnService.setServiceId("REST://xgsn");
301+
xgsnService.setTheme("XGSN");
302+
xgsnService.setSsoEnabled(true);
303+
275304
// Request Definition service
276305
LSMRegisteredServiceImpl reqDefService = new LSMRegisteredServiceImpl();
277306
reqDefService.setId(ID_REQ_DEF);
@@ -307,7 +336,7 @@ private List<LSMRegisteredServiceImpl> createDefaultServices() {
307336
reqPresService.setSsoEnabled(true);
308337

309338
return Arrays.asList(new LSMRegisteredServiceImpl[] { defaultService, httpService, lsmServerService, userManagementService, schedulerService,
310-
sdumService, reqDefService, reqPresService });
339+
sdumService, reqDefService, reqPresService, xgsnService });
311340
}
312341

313342
private void addPermission(Permission permission) {

modules/security/security-client/src/main/java/org/openiot/security/client/AccessControlUtil.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import org.apache.shiro.web.util.WebUtils;
4444
import org.pac4j.core.exception.RequiresHttpAction;
4545
import org.pac4j.oauth.client.BaseOAuth20Client;
46-
import org.pac4j.oauth.client.CasOAuthWrapperClient;
4746
import org.pac4j.oauth.profile.casoauthwrapper.CasOAuthWrapperProfile;
4847
import org.slf4j.Logger;
4948
import org.slf4j.LoggerFactory;
@@ -109,7 +108,7 @@ public static AccessControlUtil getRestInstance(String moduleName) {
109108
*/
110109
public static AccessControlUtil getRestInstance(String moduleName, String configDir) {
111110
if (instanceRest == null)
112-
instanceRest = new AccessControlUtilRest(moduleName);
111+
instanceRest = new AccessControlUtilRest(moduleName, configDir);
113112
return instanceRest;
114113
}
115114

modules/security/security-client/src/main/java/org/openiot/security/client/AccessControlUtilRest.java

+10-28
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,15 @@
2323
import io.buji.pac4j.ClientToken;
2424

2525
import java.io.IOException;
26-
import java.nio.file.Files;
27-
import java.nio.file.Path;
28-
import java.nio.file.Paths;
2926

3027
import javax.servlet.http.HttpServletRequest;
3128
import javax.servlet.http.HttpServletResponse;
3229

3330
import org.apache.shiro.SecurityUtils;
31+
import org.apache.shiro.config.Ini;
3432
import org.apache.shiro.config.IniSecurityManagerFactory;
3533
import org.apache.shiro.mgt.SecurityManager;
3634
import org.apache.shiro.subject.Subject;
37-
import org.openiot.commons.util.PropertyManagement;
38-
import org.openiot.security.client.rest.CasOAuthWrapperClientRest;
3935
import org.openiot.security.client.rest.OAuthCredentialsRest;
4036
import org.pac4j.oauth.client.BaseOAuth20Client;
4137
import org.slf4j.Logger;
@@ -57,23 +53,18 @@ class AccessControlUtilRest extends AccessControlUtil {
5753
}
5854

5955
AccessControlUtilRest(String moduleName, String configDir) {
60-
String key = null;
61-
String secret = null;
6256

6357
IniSecurityManagerFactory factory = null;
64-
if (moduleName != null) {
65-
if (configDir != null) {
66-
String iniFilePath = configDir + "/rest-client-" + moduleName + ".ini";
67-
Path path = Paths.get(iniFilePath);
68-
if (!Files.exists(path) || Files.isDirectory(path)) {
69-
logger.warn("The configuration file {} is not found.", iniFilePath);
70-
} else {
71-
factory = new IniSecurityManagerFactory("file:" + iniFilePath);
72-
}
58+
if (moduleName != null && configDir != null) {
59+
Ini ini;
60+
if (configDir.equals(System.getProperty("jboss.server.config.dir"))) {
61+
ini = ConfigFileReader.getIniConfig(configDir, moduleName);
62+
} else {
63+
ini = ConfigFileReader.getIniConfigByFile(configDir, "rest-client.ini");
64+
}
65+
if (ini != null) {
66+
factory = new IniSecurityManagerFactory(ini);
7367
}
74-
PropertyManagement props = new PropertyManagement();
75-
key = props.getProperty("casOauthClient.key." + moduleName, null);
76-
secret = props.getProperty("casOauthClient.secret." + moduleName, null);
7768
}
7869
if (factory == null) {
7970
logger.info("Falling back to the rest-client.ini in the class path");
@@ -83,15 +74,6 @@ class AccessControlUtilRest extends AccessControlUtil {
8374

8475
SecurityManager securityManager = factory.getInstance();
8576
SecurityUtils.setSecurityManager(securityManager);
86-
87-
if (key != null && secret != null) {
88-
CasOAuthWrapperClientRest bean = (CasOAuthWrapperClientRest) factory.getBeans().get("casOauthClient");
89-
bean.setKey(key);
90-
bean.setSecret(secret);
91-
} else if (moduleName != null) {
92-
logger.warn("casOauthClient.key.{} or/and casOauthClient.secret.{} is not set in the global properties file", moduleName, moduleName);
93-
}
94-
9577
}
9678

9779
public OAuthorizationCredentials login(String username, String password) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.openiot.security.client;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileReader;
5+
import java.io.IOException;
6+
import java.nio.file.Files;
7+
import java.nio.file.Path;
8+
import java.nio.file.Paths;
9+
10+
import org.apache.shiro.config.Ini;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
public class ConfigFileReader {
15+
private static Logger logger = LoggerFactory.getLogger(ConfigFileReader.class);
16+
17+
private final static String CONFIG_FILE_NAME = "security-config.ini";
18+
private final static String CONFIG_BEGIN_DELIMITER = "@BEGIN-";
19+
private final static String CONFIG_END_DELIMITER = "@END-";
20+
21+
public static Ini getIniConfigByFile(String configDir, String fileName) {
22+
if (configDir == null || fileName == null)
23+
return null;
24+
Ini ini = null;
25+
String iniFilePath = configDir + "/" + fileName;
26+
Path path = Paths.get(iniFilePath);
27+
if (!Files.exists(path) || Files.isDirectory(path)) {
28+
logger.warn("The configuration file {} was not found.", iniFilePath);
29+
} else {
30+
ini = new Ini();
31+
logger.debug("Loading ini configuration from {} ", iniFilePath);
32+
ini.loadFromPath(iniFilePath);
33+
}
34+
35+
return ini;
36+
}
37+
38+
public static Ini getIniConfig(String configDir, String moduleName) {
39+
if (configDir == null || moduleName == null)
40+
return null;
41+
42+
Ini ini = null;
43+
String iniFilePath = configDir + "/" + CONFIG_FILE_NAME;
44+
Path path = Paths.get(iniFilePath);
45+
if (!Files.exists(path) || Files.isDirectory(path)) {
46+
logger.warn("The configuration file {} was not found.", iniFilePath);
47+
} else {
48+
logger.debug("Loading ini configuration from {} ", iniFilePath);
49+
BufferedReader reader = null;
50+
try {
51+
reader = new BufferedReader(new FileReader(iniFilePath));
52+
String line = reader.readLine();
53+
boolean sectionFound = false;
54+
String beginDelim = CONFIG_BEGIN_DELIMITER + moduleName;
55+
String endDelim = CONFIG_END_DELIMITER + moduleName;
56+
StringBuilder sb = new StringBuilder();
57+
while (line != null) {
58+
if (!sectionFound && line.startsWith(beginDelim)) {
59+
sectionFound = true;
60+
} else if (sectionFound) {
61+
if (line.startsWith(endDelim)) {
62+
break;
63+
} else {
64+
sb.append(line).append("\n");
65+
}
66+
}
67+
line = reader.readLine();
68+
}
69+
if (!sectionFound || sb.length() == 0) {
70+
logger.error("Could not find the configuration section for module {}", moduleName);
71+
} else {
72+
ini = new Ini();
73+
ini.load(sb.toString());
74+
}
75+
76+
} catch (IOException e) {
77+
logger.error("Error reading configuration file", e);
78+
} finally {
79+
if (reader != null)
80+
try {
81+
reader.close();
82+
} catch (IOException e) {
83+
logger.error("IO Error", e);
84+
}
85+
}
86+
}
87+
88+
return ini;
89+
}
90+
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
package org.openiot.security.client;
22

3-
import java.nio.file.Files;
4-
import java.nio.file.Path;
5-
import java.nio.file.Paths;
6-
73
import org.apache.shiro.config.Ini;
84
import org.apache.shiro.util.CollectionUtils;
95
import org.apache.shiro.util.StringUtils;
106
import org.apache.shiro.web.env.IniWebEnvironment;
11-
import org.openiot.commons.util.PropertyManagement;
12-
import org.openiot.security.client.rest.CasOAuthWrapperClientRest;
137
import org.slf4j.Logger;
148
import org.slf4j.LoggerFactory;
159

@@ -20,24 +14,12 @@ public class CustomIniWebEnvironment extends IniWebEnvironment {
2014
@Override
2115
public void init() {
2216
String jbossConfigDir = System.getProperty("jboss.server.config.dir");
23-
String key = null;
24-
String secret = null;
2517
Ini ini = null;
2618

2719
String moduleName = getServletContext().getInitParameter(MODULE_NAME_PARAM);
2820

2921
if (StringUtils.hasText(moduleName) && jbossConfigDir != null) {
30-
PropertyManagement props = new PropertyManagement();
31-
String iniFilePath = jbossConfigDir + "/web-client-" + moduleName + ".ini";
32-
Path path = Paths.get(iniFilePath);
33-
if (!Files.exists(path) || Files.isDirectory(path)) {
34-
logger.warn("The configuration file {} is not found.", iniFilePath);
35-
} else {
36-
ini = getSpecifiedIni(new String[] { "file:" + iniFilePath });
37-
}
38-
39-
key = props.getProperty("casOauthClient.key." + moduleName, null);
40-
secret = props.getProperty("casOauthClient.secret." + moduleName, null);
22+
ini = ConfigFileReader.getIniConfig(jbossConfigDir, moduleName);
4123
}
4224
if (CollectionUtils.isEmpty(ini)) {
4325
logger.info("Falling back to the web-client.ini in the class path");
@@ -48,14 +30,6 @@ public void init() {
4830
setIni(ini);
4931
configure();
5032

51-
if (key != null && secret != null) {
52-
CasOAuthWrapperClientRest bean = getObject("casOauthClient", CasOAuthWrapperClientRest.class);
53-
bean.setKey(key);
54-
bean.setSecret(secret);
55-
} else {
56-
logger.warn("casOauthClient.key.{} or/and casOauthClient.secret.{} is not set in the global properties file", moduleName, moduleName);
57-
}
5833
}
5934

60-
6135
}

modules/security/security-management/src/main/java/org/openiot/security/mgmt/LoginController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public String signInWithOpenIoT() {
6666
}
6767

6868
public String getSignOutOfCASLink() {
69-
return AccessControlUtil.getInstance().getLogoutURL();
69+
return Utils.getPropertyManagement().getCASLogoutURL();
7070
}
7171

7272
}

modules/security/security-management/src/main/webapp/perms.xhtml

+3-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
<h:panelGrid columns="1" style="width:100%" cellpadding="5">
4545
<h:panelGroup id="permissionsPanel" layout="block" style="width:100%">
4646
<p:dataTable var="perm" value="#{permissionsController.permissions}" id="permissionsTable" tableStyle="width:100%;" selectionMode="single"
47-
selection="#{permissionsController.selectedPermission}" rowKey="#{perm.name}" emptyMessage="Permission list is empty." resizableColumns="true">
47+
selection="#{permissionsController.selectedPermission}" rowKey="#{perm.name}" emptyMessage="Permission list is empty." resizableColumns="true"
48+
paginator="true" rows="10" paginatorPosition="bottom">
4849

4950
<p:ajax event="rowSelect" update=":rolesForm:permissionsTable:removePermBtn :rolesForm:usersTable :permForm:permRolesPanel" />
5051
<p:ajax event="rowUnselect" update=":rolesForm:permissionsTable:removePermBtn :rolesForm:usersTable :permForm:permRolesPanel" />
@@ -82,7 +83,7 @@
8283
style="table-layout: fixed; font-size:smaller;" emptyMessage="User list is empty.">
8384

8485
<f:facet name="header">
85-
<h:outputText value="Permission Users" />
86+
<h:outputText value="#{permissionsController.selectedPermission == null ? 'Permission Users' : 'Permission Users ('.concat(permissionsController.selectedPermission.name).concat(')')}" />
8687
</f:facet>
8788

8889
<p:column headerText="Full name" width="35%">

modules/security/security-management/src/main/webapp/roles.xhtml

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
<h:panelGrid columns="1" style="width:100%" cellpadding="5">
4444
<h:panelGroup layout="block" style="width:100%">
4545
<p:dataTable var="role" value="#{rolesController.roles}" rowKey="#{role.name}" id="rolesTable" resizableColumns="true" editable="false"
46-
selectionMode="single" selection="#{rolesController.selectedRole}" style="table-layout: fixed">
46+
selectionMode="single" selection="#{rolesController.selectedRole}" style="table-layout: fixed"
47+
paginator="true" rows="10" paginatorPosition="bottom">
4748

4849
<p:ajax event="rowEdit" listener="#{rolesController.onEditRole}" update=":messages" />
4950
<p:ajax event="rowEditCancel" listener="#{rolesController.onCancelEditRole}" update=":messages" />
@@ -113,7 +114,7 @@
113114
<p:ajax event="rowUnselect" update=":rolesForm:usersTable:removeUserBtn" />
114115

115116
<f:facet name="header">
116-
<h:outputText value="Role Users" />
117+
<h:outputText value="#{rolesController.selectedRole == null ? 'Role Users' : 'Role Users ('.concat(rolesController.selectedRole.name).concat(')')}" />
117118
</f:facet>
118119

119120
<p:column headerText="Full name" width="35%">

0 commit comments

Comments
 (0)