apolloconfig/apollo

Spring Security简单认证改造问题

Open

#2839 aperta il 12 dic 2019

Vedi su GitHub
 (1 commento) (0 reazioni) (0 assegnatari)Java (10.177 fork)batch import
feature requesthelp wanted

Metriche repository

Star
 (29.769 star)
Metriche merge PR
 (Merge medio 4g 13h) (6 PR mergiate in 30 g)

Descrizione

背景: 公司大部分都是业务人员,不想接入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"}; 这样文本框可以回显

请各位指教。

Guida contributor