Skip to content

Commit 5e3eebd

Browse files
authored
feat: support seeding default superuser via application.properties (#565)
* feat: support default superuser * seed only necessary props add enable flag * remove obsolete pulsar-manager.account * import * fix build - imports * disable superuser seed flag by default * queue pr checks * adjust check
1 parent abf8328 commit 5e3eebd

File tree

5 files changed

+95
-34
lines changed

5 files changed

+95
-34
lines changed

src/README.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ Pulsar manager backend is a supplement and improvement to Pulsar broker.
88

99
### Supported configurations of backend
1010

11-
| Name | Default |Description
12-
| ------- | ------- | ------- |
13-
| `server.port` | 7750 | Port of backend service |
14-
| `pulsar-manager.account` | pulsar | Login account |
15-
| `pulsar-manager.password` | pulsar | Login password |
16-
| `redirect.host` | localhost | IP address of front-end service |
17-
| `redirect.port` | 9527 | Port of front-end service |
18-
| `insert.stats.interval` | 30000ms | Time interval for collecting statistical information |
19-
| `clear.stats.interval` | 300000ms | Time interval for cleaning statistics |
11+
| Name | Default | Description |
12+
| ----------------------- | --------- | ---------------------------------------------------- |
13+
| `server.port` | 7750 | Port of backend service |
14+
| `redirect.host` | localhost | IP address of front-end service |
15+
| `redirect.port` | 9527 | Port of front-end service |
16+
| `insert.stats.interval` | 30000ms | Time interval for collecting statistical information |
17+
| `clear.stats.interval` | 300000ms | Time interval for cleaning statistics |
2018

2119
### How to set parameters when starting back-end services
2220

src/main/java/org/apache/pulsar/manager/PulsarApplicationListener.java

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,28 @@
1313
*/
1414
package org.apache.pulsar.manager;
1515

16-
import com.github.pagehelper.Page;
17-
import lombok.extern.slf4j.Slf4j;
16+
import java.util.Map;
17+
import java.util.Optional;
18+
19+
import org.apache.commons.codec.digest.DigestUtils;
20+
import org.apache.commons.lang.StringUtils;
1821
import org.apache.pulsar.client.admin.PulsarAdminException;
1922
import org.apache.pulsar.manager.entity.EnvironmentEntity;
2023
import org.apache.pulsar.manager.entity.EnvironmentsRepository;
24+
import org.apache.pulsar.manager.entity.UserInfoEntity;
25+
import org.apache.pulsar.manager.entity.UsersRepository;
2126
import org.apache.pulsar.manager.service.PulsarAdminService;
27+
import org.apache.pulsar.manager.service.UsersService;
2228
import org.springframework.beans.factory.annotation.Autowired;
2329
import org.springframework.beans.factory.annotation.Value;
2430
import org.springframework.context.ApplicationListener;
2531
import org.springframework.context.event.ContextRefreshedEvent;
2632
import org.springframework.stereotype.Component;
2733

28-
import java.util.Optional;
34+
import com.github.pagehelper.Page;
35+
36+
import lombok.extern.slf4j.Slf4j;
37+
2938

3039
/**
3140
* PulsarApplicationListener do something after the spring framework initialization is complete.
@@ -38,6 +47,10 @@ public class PulsarApplicationListener implements ApplicationListener<ContextRef
3847

3948
private final PulsarAdminService pulsarAdminService;
4049

50+
private final UsersRepository usersRepository;
51+
52+
private final UsersService usersService;
53+
4154
@Value("${default.environment.name}")
4255
private String defaultEnvironmentName;
4356

@@ -47,20 +60,79 @@ public class PulsarApplicationListener implements ApplicationListener<ContextRef
4760
@Value("${default.environment.bookie_url}")
4861
private String defaultEnvironmentBookieUrl;
4962

63+
@Value("${default.superuser.enable}")
64+
private Boolean defaultSuperuserEnable = false;
65+
66+
@Value("${default.superuser.name}")
67+
private String defaultSuperuserName;
68+
69+
@Value("${default.superuser.email}")
70+
private String defaultSuperuserEmail;
71+
72+
@Value("${default.superuser.password}")
73+
private String defaultSuperuserPassword;
74+
5075
@Autowired
51-
public PulsarApplicationListener(EnvironmentsRepository environmentsRepository, PulsarAdminService pulsarAdminService) {
76+
public PulsarApplicationListener(
77+
EnvironmentsRepository environmentsRepository,
78+
PulsarAdminService pulsarAdminService,
79+
UsersRepository usersRepository,
80+
UsersService usersService
81+
) {
5282
this.environmentsRepository = environmentsRepository;
5383
this.pulsarAdminService = pulsarAdminService;
84+
this.usersRepository = usersRepository;
85+
this.usersService = usersService;
5486
}
5587

5688
@Override
5789
public void onApplicationEvent(ContextRefreshedEvent event) {
5890
log.info("Start onApplicationEvent");
59-
Page<EnvironmentEntity> environmentEntities = environmentsRepository
60-
.getEnvironmentsList(1, 1);
91+
92+
seedDefaultSuperuser();
93+
seedDefaultEnvironment();
94+
}
95+
96+
private void seedDefaultSuperuser() {
97+
if(defaultSuperuserEnable == false) {
98+
log.debug("Superuser seed disabled");
99+
return;
100+
}
101+
102+
UserInfoEntity userInfoEntity = new UserInfoEntity();
103+
userInfoEntity.setName(defaultSuperuserName);
104+
userInfoEntity.setEmail(defaultSuperuserEmail);
105+
userInfoEntity.setPassword(defaultSuperuserPassword);
106+
107+
Map<String, String> userValidateResult = usersService.validateUserInfo(userInfoEntity);
108+
if (userValidateResult.get("error") != null) {
109+
log.error("Superuser seed failed.", userValidateResult.get("error"));
110+
System.exit(-1);
111+
}
112+
if (StringUtils.isBlank(userInfoEntity.getPassword())) {
113+
log.error("Superuser seed failed. Password is required.");
114+
System.exit(-1);
115+
}
116+
117+
Optional<UserInfoEntity> optionalUserEntity = usersRepository.findByUserName(userInfoEntity.getName());
118+
if (optionalUserEntity.isPresent()) {
119+
log.warn("Superuser already exists.");
120+
return;
121+
}
122+
123+
userInfoEntity.setPassword(DigestUtils.sha256Hex(userInfoEntity.getPassword()));
124+
usersRepository.save(userInfoEntity);
125+
126+
log.info("Successfully added a default superuser: name = {}, email = {}, password = {}.",
127+
defaultSuperuserName, defaultSuperuserEmail, defaultSuperuserPassword);
128+
}
129+
130+
private void seedDefaultEnvironment() {
131+
Page<EnvironmentEntity> environmentEntities = environmentsRepository.getEnvironmentsList(1, 1);
132+
61133
if (environmentEntities.getResult().size() <= 0) {
62-
Optional<EnvironmentEntity> environmentEntityOptional = environmentsRepository
63-
.findByName(defaultEnvironmentName);
134+
Optional<EnvironmentEntity> environmentEntityOptional = environmentsRepository.findByName(defaultEnvironmentName);
135+
64136
if (defaultEnvironmentName != null
65137
&& defaultEnvironmentServiceUrl != null
66138
&& defaultEnvironmentName.length() > 0
@@ -89,6 +161,7 @@ public void onApplicationEvent(ContextRefreshedEvent event) {
89161
log.warn("The default environment already exists.");
90162
}
91163
}
164+
92165
log.debug("Environments already exist.");
93166
}
94167
}

src/main/java/org/apache/pulsar/manager/controller/LoginController.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,6 @@ public LoginController(JwtService jwtService) {
6565
@Autowired
6666
private CasdoorAuthService casdoorAuthService;
6767

68-
@Value("${pulsar-manager.account}")
69-
private String account;
70-
71-
@Value("${pulsar-manager.password}")
72-
private String password;
73-
7468
@ApiOperation(value = "Login pulsar manager")
7569
@ApiResponses({@ApiResponse(code = 200, message = "ok"), @ApiResponse(code = 500, message = "Internal server error")})
7670
@RequestMapping(value = "/login", method = RequestMethod.POST)

src/main/java/org/apache/pulsar/manager/controller/UsersController.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@
5454
@Api(description = "Functions under this class are available to super user.")
5555
public class UsersController {
5656

57-
@Value("${user.management.enable}")
58-
private boolean userManagementEnable;
59-
60-
@Value("${pulsar-manager.account}")
61-
private String account;
62-
6357
private final UsersRepository usersRepository;
6458

6559
private final UsersService usersService;

src/main/resources/application.properties

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,6 @@ backend.broker.pulsarAdmin.tlsEnableHostnameVerification=false
8484

8585
jwt.secret=dab1c8ba-b01b-11e9-b384-186590e06885
8686
jwt.sessionTime=2592000
87-
# If user.management.enable is true, the following account and password will no longer be valid.
88-
pulsar-manager.account=pulsar
89-
pulsar-manager.password=pulsar
90-
# If true, the database is used for user management
91-
user.management.enable=true
9287

9388
# Optional -> SECRET, PRIVATE, default -> PRIVATE, empty -> disable auth
9489
# SECRET mode -> bin/pulsar tokens create --secret-key file:///path/to/my-secret.key --subject test-user
@@ -132,6 +127,13 @@ spring.thymeleaf.mode=HTML5
132127
default.environment.name=
133128
default.environment.service_url=
134129
default.environment.bookie_url=
130+
131+
# default superuser configuration
132+
default.superuser.enable=
133+
default.superuser.name=
134+
default.superuser.password=
135+
default.superuser.email=
136+
135137
# enable tls encryption
136138
# keytool -import -alias test-keystore -keystore ca-certs -file certs/ca.cert.pem
137139
tls.enabled=false

0 commit comments

Comments
 (0)