Skip to content

Commit b62c88b

Browse files
committed
fix[litemall-admin, litemall-admin-api]: 修复后台系统角色权限传递问题 #403
1 parent 21ac9ac commit b62c88b

File tree

3 files changed

+76
-7
lines changed

3 files changed

+76
-7
lines changed

litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminRoleController.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.linlinjava.litemall.admin.web;
22

3+
import io.swagger.models.auth.In;
34
import org.apache.commons.logging.Log;
45
import org.apache.commons.logging.LogFactory;
6+
import org.apache.shiro.SecurityUtils;
57
import org.apache.shiro.authz.annotation.RequiresPermissions;
8+
import org.apache.shiro.subject.Subject;
69
import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc;
710
import org.linlinjava.litemall.admin.util.AdminResponseCode;
811
import org.linlinjava.litemall.admin.util.Permission;
@@ -25,10 +28,10 @@
2528
import org.springframework.web.bind.annotation.*;
2629

2730
import javax.validation.constraints.NotNull;
31+
import java.security.Security;
2832
import java.util.*;
2933

30-
import static org.linlinjava.litemall.admin.util.AdminResponseCode.ROLE_NAME_EXIST;
31-
import static org.linlinjava.litemall.admin.util.AdminResponseCode.ROLE_USER_EXIST;
34+
import static org.linlinjava.litemall.admin.util.AdminResponseCode.*;
3235

3336
@RestController
3437
@RequestMapping("/admin/role")
@@ -159,15 +162,15 @@ private List<PermVo> getSystemPermissions() {
159162
return systemPermissions;
160163
}
161164

162-
private Set<String> getAssignedPermissions(Integer roleId) {
165+
private Set<String> getAssignedPermissions(List<Integer> roleIds) {
163166
// 这里需要注意的是,如果存在超级权限*,那么这里需要转化成当前所有系统权限。
164167
// 之所以这么做,是因为前端不能识别超级权限,所以这里需要转换一下。
165168
Set<String> assignedPermissions = null;
166-
if (permissionService.checkSuperPermission(roleId)) {
169+
if (permissionService.checkSuperPermission(roleIds)) {
167170
getSystemPermissions();
168171
assignedPermissions = systemPermissionsString;
169172
} else {
170-
assignedPermissions = permissionService.queryByRoleId(roleId);
173+
assignedPermissions = permissionService.queryByRoleId(roleIds);
171174
}
172175

173176
return assignedPermissions;
@@ -176,18 +179,38 @@ private Set<String> getAssignedPermissions(Integer roleId) {
176179
/**
177180
* 管理员的权限情况
178181
*
179-
* @return 系统所有权限列表和管理员已分配权限
182+
* @return 系统所有权限列表、角色权限、管理员已分配权限
180183
*/
181184
@RequiresPermissions("admin:role:permission:get")
182185
@RequiresPermissionsDesc(menu = {"系统管理", "角色管理"}, button = "权限详情")
183186
@GetMapping("/permissions")
184187
public Object getPermissions(Integer roleId) {
185188
List<PermVo> systemPermissions = getSystemPermissions();
186-
Set<String> assignedPermissions = getAssignedPermissions(roleId);
189+
190+
// 这里需要注意的是,如果存在超级权限*,那么这里需要转化成当前所有系统权限。
191+
// 之所以这么做,是因为前端不能识别超级权限,所以这里需要转换一下。
192+
Set<String> assignedPermissions = null;
193+
if (permissionService.checkSuperPermission(roleId)) {
194+
getSystemPermissions();
195+
assignedPermissions = systemPermissionsString;
196+
} else {
197+
assignedPermissions = permissionService.queryByRoleId(roleId);
198+
}
199+
200+
Subject currentUser = SecurityUtils.getSubject();
201+
LitemallAdmin currentAdmin = (LitemallAdmin) currentUser.getPrincipal();
202+
Integer[] roles = currentAdmin.getRoleIds();
203+
List<Integer> roleIds = Arrays.asList(roles);
204+
Set<String> curPermissions = null;
205+
if (!permissionService.checkSuperPermission(roleIds)) {
206+
curPermissions = permissionService.queryByRoleId(roleIds);
207+
}
208+
187209

188210
Map<String, Object> data = new HashMap<>();
189211
data.put("systemPermissions", systemPermissions);
190212
data.put("assignedPermissions", assignedPermissions);
213+
data.put("curPermissions", curPermissions);
191214
return ResponseUtil.ok(data);
192215
}
193216

litemall-admin/src/views/sys/role.vue

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,25 @@ export default {
225225
.then(response => {
226226
this.systemPermissions = response.data.data.systemPermissions
227227
this.assignedPermissions = response.data.data.assignedPermissions
228+
var _curPermissions = response.data.data.curPermissions
229+
if (_curPermissions) {
230+
var _map = {}
231+
_curPermissions.forEach(r => {
232+
_map[r] = true
233+
})
234+
235+
this.systemPermissions.forEach(i => {
236+
i.children.forEach(j => {
237+
j.children.forEach(k => {
238+
if (_map[k.id]) {
239+
k.disabled = false
240+
} else {
241+
k.disabled = true
242+
}
243+
})
244+
})
245+
})
246+
}
228247
})
229248
},
230249
updatePermission() {

litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallPermissionService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,23 @@ public Set<String> queryByRoleId(Integer roleId) {
5555
return permissions;
5656
}
5757

58+
public Set<String> queryByRoleId(List<Integer> roleIds) {
59+
Set<String> permissions = new HashSet<String>();
60+
if(roleIds == null || roleIds.isEmpty()){
61+
return permissions;
62+
}
63+
64+
LitemallPermissionExample example = new LitemallPermissionExample();
65+
example.or().andRoleIdIn(roleIds).andDeletedEqualTo(false);
66+
List<LitemallPermission> permissionList = permissionMapper.selectByExample(example);
67+
68+
for(LitemallPermission permission : permissionList){
69+
permissions.add(permission.getPermission());
70+
}
71+
72+
return permissions;
73+
}
74+
5875
public boolean checkSuperPermission(Integer roleId) {
5976
if(roleId == null){
6077
return false;
@@ -65,6 +82,16 @@ public boolean checkSuperPermission(Integer roleId) {
6582
return permissionMapper.countByExample(example) != 0;
6683
}
6784

85+
public boolean checkSuperPermission(List<Integer> roleIds) {
86+
if(roleIds == null || roleIds.isEmpty()){
87+
return false;
88+
}
89+
90+
LitemallPermissionExample example = new LitemallPermissionExample();
91+
example.or().andRoleIdIn(roleIds).andPermissionEqualTo("*").andDeletedEqualTo(false);
92+
return permissionMapper.countByExample(example) != 0;
93+
}
94+
6895
public void deleteByRoleId(Integer roleId) {
6996
LitemallPermissionExample example = new LitemallPermissionExample();
7097
example.or().andRoleIdEqualTo(roleId).andDeletedEqualTo(false);

0 commit comments

Comments
 (0)