apolloconfig/apollo

Spring Security简单认证改造问题

Open

#2839 opened on Dec 12, 2019

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Java (29,769 stars) (10,177 forks)batch import
feature requesthelp wanted

Description

背景: 公司大部分都是业务人员,不想接入SSO,直接用Spring Security简单认证,但是这个登录只有管理员可以修改用户信息,希望普通用户登录后可以自己修改个人信息;

改造: 1、修改static/views/common/nav.html 用户退出:

user-manage-comm.html 直接拷贝的 user-manage.html

2、修改 static/scripts/services/UserService.js,增加 update_comm_user appService.service('UserService', ['$resource', '$q', function ($resource, $q) { var user_resource = $resource('', {}, { load_user: { method: 'GET', url: '/user' }, find_users: { method: 'GET', url: '/users' }, create_or_update_user: { method: 'POST', url: '/users' }, update_comm_user: { method: 'POST', url: '/userscomm' } }); return { load_user: function () { var finished = false; var d = $q.defer(); user_resource.load_user({}, function (result) { finished = true; d.resolve(result); }, function (result) { finished = true; d.reject(result); }); return d.promise; }, find_users: function (keyword) { var d = $q.defer(); user_resource.find_users({ keyword: keyword }, function (result) { d.resolve(result); }, function (result) { d.reject(result); }); return d.promise; }, createOrUpdateUser: function (user) { var d = $q.defer(); user_resource.create_or_update_user({}, user, function (result) { d.resolve(result); }, function (result) { d.reject(result); }); return d.promise;
}, updateCommUser: function (user) { var d = $q.defer(); user_resource.update_comm_user({}, user, function (result) { d.resolve(result); }, function (result) { d.reject(result); }); return d.promise; } } }]);

3、修改 com/ctrip/framework/apollo/portal/spi/springsecurity/SpringSecurityUserService.java,增加 @Transactional public void updateComm(UserPO user) { String username = user.getUsername();

User userDetails = new User(username, encoder.encode(user.getPassword()), authorities);

if (userDetailsManager.userExists(username)) {
  userDetailsManager.updateUser(userDetails);
  UserPO managedUser = userRepository.findByUsername(username);
  managedUser.setEmail(user.getEmail());

  userRepository.save(managedUser);
}

}

4、修改 com/ctrip/framework/apollo/portal/controller/UserInfoController.java 增加 @PostMapping("/userscomm") public void updateCommUser(@RequestBody UserPO user) { if (StringUtils.isContainEmpty(user.getUsername(), user.getPassword())) { throw new BadRequestException("Username and password can not be empty."); }

if (userService instanceof SpringSecurityUserService) {
  ((SpringSecurityUserService) userService).updateComm(user);
} else {
  throw new UnsupportedOperationException("Create or update user operation is unsupported");
}

}

5、经过上面步骤,此时普通用户可以修改用户信息,但是希望只能修改自己的信息,所以希望用户名文本框是带回回显只读,并绑定user.username,但是 directive 导入的userName无法赋值,文本框是空值,自己写的例子可以,但是apollo工程中修改/user-manage-comm.html 用户名文本框就不行。 方法一: 修改 /user-manage-comm.html 或

方法二: 修改 /user-manage-comm.html 修改 static/scripts/controller/UserController.js $scope.user={} 改为 $scope.user={"username":$scope.userName};

6、将上面方法二 修改 static/scripts/controller/UserController.js $scope.user={} 改为 $scope.user={"username":"zhangsan"}; 这样文本框可以回显

请各位指教。

Contributor guide