Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: A user-friendly user management page for apollo portal #4464

Merged
merged 21 commits into from
Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ public UserInfoController(

@PreAuthorize(value = "@permissionValidator.isSuperAdmin()")
@PostMapping("/users")
public void createOrUpdateUser(@RequestBody UserPO user) {
public void createOrUpdateUser(
@RequestParam(value = "isCreate", defaultValue = "false") boolean isCreate,
@RequestBody UserPO user) {
if (StringUtils.isContainEmpty(user.getUsername(), user.getPassword())) {
throw new BadRequestException("Username and password can not be empty.");
}
Expand All @@ -71,7 +73,11 @@ public void createOrUpdateUser(@RequestBody UserPO user) {
}

if (userService instanceof SpringSecurityUserService) {
((SpringSecurityUserService) userService).createOrUpdate(user);
if (isCreate) {
((SpringSecurityUserService) userService).create(user);
} else {
((SpringSecurityUserService) userService).update(user);
}
} else {
throw new UnsupportedOperationException("Create or update user operation is unsupported");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package com.ctrip.framework.apollo.portal.spi.springsecurity;

import com.ctrip.framework.apollo.common.exception.BadRequestException;
import com.ctrip.framework.apollo.core.utils.StringUtils;
import com.ctrip.framework.apollo.portal.entity.bo.UserInfo;
import com.ctrip.framework.apollo.portal.entity.po.Authority;
Expand Down Expand Up @@ -56,28 +57,38 @@ public SpringSecurityUserService(
}

@Transactional
public void createOrUpdate(UserPO user) {
public void create(UserPO user) {
String username = user.getUsername();
String newPassword = passwordEncoder.encode(user.getPassword());
UserPO managedUser = userRepository.findByUsername(username);
if (managedUser != null) {
throw new BadRequestException("User %s already exists", username);
}
//create
user.setPassword(newPassword);
user.setEnabled(user.getEnabled());
userRepository.save(user);

//save authorities
Authority authority = new Authority();
authority.setUsername(username);
authority.setAuthority("ROLE_user");
authorityRepository.save(authority);
}

@Transactional
public void update(UserPO user) {
String username = user.getUsername();
String newPassword = passwordEncoder.encode(user.getPassword());
UserPO managedUser = userRepository.findByUsername(username);
if (managedUser == null) {
user.setPassword(newPassword);
user.setEnabled(user.getEnabled());
userRepository.save(user);

//save authorities
Authority authority = new Authority();
authority.setUsername(username);
authority.setAuthority("ROLE_user");
authorityRepository.save(authority);
} else {
managedUser.setPassword(newPassword);
managedUser.setEmail(user.getEmail());
managedUser.setUserDisplayName(user.getUserDisplayName());
managedUser.setEnabled(user.getEnabled());
userRepository.save(managedUser);
throw new BadRequestException("User does not exist, please create a new user.");
}
managedUser.setPassword(newPassword);
managedUser.setEmail(user.getEmail());
managedUser.setUserDisplayName(user.getUserDisplayName());
managedUser.setEnabled(user.getEnabled());
userRepository.save(managedUser);
}

@Transactional
Expand Down
2 changes: 2 additions & 0 deletions apollo-portal/src/main/resources/static/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,8 @@
"UserMange.Email": "Email",
"UserMange.Created": "Create user successfully",
"UserMange.CreateFailed": "Failed to create user",
"UserMange.Edited": "Edit user successfully",
"UserMange.EditedFailed": "Failed to Edit user",
nobodyiam marked this conversation as resolved.
Show resolved Hide resolved
"UserMange.Enabled.succeed": "Change user enabled successfully",
"UserMange.Enabled.failure": "Failed to change user enabled",
"UserMange.Enabled": "Enabled",
nobodyiam marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
2 changes: 2 additions & 0 deletions apollo-portal/src/main/resources/static/i18n/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,8 @@
"UserMange.Email": "邮箱",
"UserMange.Created": "创建用户成功",
"UserMange.CreateFailed": "创建用户失败",
"UserMange.Edited": "编辑用户成功",
"UserMange.EditedFailed": "编辑用户失败",
nobodyiam marked this conversation as resolved.
Show resolved Hide resolved
"UserMange.Enabled.succeed": "修改用户状态成功",
"UserMange.Enabled.failure": "修改用户状态失败",
"UserMange.Enabled": "用户状态",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,24 @@ function UserController($scope, $window, $translate, toastr, AppUtil, UserServic
}

$scope.createOrUpdateUser = function () {
UserService.createOrUpdateUser($scope.user).then(function (result) {
toastr.success($translate.instant('UserMange.Created'));
getCreatedUsers()
changeStatus('1')
}, function (result) {
AppUtil.showErrorMsg(result, $translate.instant('UserMange.CreateFailed'));
})
if ($scope.status === '2') {
UserService.createOrUpdateUser(true, $scope.user).then(function (result) {
toastr.success($translate.instant('UserMange.Created'));
getCreatedUsers()
changeStatus('1')
}, function (result) {
AppUtil.showErrorMsg(result, $translate.instant('UserMange.CreateFailed'));
})
} else {
UserService.createOrUpdateUser(false,$scope.user).then(function (result) {
toastr.success($translate.instant('UserMange.Edited'));
getCreatedUsers()
changeStatus('1')
}, function (result) {
AppUtil.showErrorMsg(result, $translate.instant('UserMange.EditedFailed'));
})
}


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ appService.service('UserService', ['$resource', '$q', 'AppUtil', function ($reso
},
create_or_update_user: {
method: 'POST',
url: AppUtil.prefixPath() + '/users'
url: AppUtil.prefixPath() + '/users?isCreate=:isCreate'
}
});
return {
Expand Down Expand Up @@ -74,9 +74,11 @@ appService.service('UserService', ['$resource', '$q', 'AppUtil', function ($reso
});
return d.promise;
},
createOrUpdateUser: function (user) {
createOrUpdateUser: function (isCreate, user) {
var d = $q.defer();
user_resource.create_or_update_user({}, user,
user_resource.create_or_update_user({
isCreate: isCreate
}, user,
function (result) {
d.resolve(result);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void testCreateOrUpdateUser() {
Mockito.when(userPasswordChecker.checkWeakPassword(Mockito.anyString()))
.thenReturn(new CheckResult(Boolean.TRUE, ""));

userInfoController.createOrUpdateUser(user);
userInfoController.createOrUpdateUser(true, user);
}

@Test(expected = BadRequestException.class)
Expand All @@ -63,7 +63,7 @@ public void testCreateOrUpdateUserFailed() {
.thenReturn(new CheckResult(Boolean.FALSE, msg));

try {
userInfoController.createOrUpdateUser(user);
userInfoController.createOrUpdateUser(true, user);
} catch (BadRequestException e) {
Assert.assertEquals(msg, e.getMessage());
throw e;
Expand Down