# 使用注解控制權限,是以需要在security配置類上開啟配置;否則注解不生效
@EnableGlobalMethodSecurity(prePostEnabled = true)
- 檢視資料庫,test使用者擁有的角色權限為普通管理者;普通管理者擁有的權限資源為28
- 通路接口http://localhost/permission/list,跳轉到403頁面
- 将普通管理者擁有的權限資源修改為29,在次測試,擷取成功
- 代碼實作
# 控制層
@Controller
@RequestMapping("/permission")
public class SysPermissionController {
private static final String HTML_PREFIX = "system/permission/";
// 跳轉到分頁查詢頁面
@PreAuthorize("hasAuthority('sys:permission')")
@GetMapping(value = {"/", ""})
public String permission() {
return HTML_PREFIX + "permission-list";
}
// 業務層對象
@Autowired
private SysPermissionService sysPermissionService;
// 查詢所有權限資源
@PreAuthorize("hasAuthority('sys:permission:list')")
@GetMapping("/list")
@ResponseBody
public MengxueguResult list() {
// MyBatis-plus已經提供的,查詢SysPermission表中的所有記錄
List<SysPermission> list = sysPermissionService.list();
return MengxueguResult.ok(list);
}
/**
* 跳轉新增或者修改頁面
* /form 新增
* /form/{id} 修改
* @PathVariable(required = false) 設定為false,則id可傳也可不傳,不然報500
* @return
*/
@PreAuthorize("hasAnyAuthority('sys:permission:edit', 'sys:permission:add')")
@GetMapping(value = {"/form", "/form/{id}"})
public String form(@PathVariable(required = false) Long id, Model model) {
// 1. 通過權限id查詢對應權限資訊
SysPermission permission = sysPermissionService.getById(id);
// 綁定後頁面可擷取
model.addAttribute("permission", permission == null ? new SysPermission() : permission);
return HTML_PREFIX + "permission-form";
}
/**
* 送出新增或修改的資料
* @param permission
* @return
*/
@PreAuthorize("hasAnyAuthority('sys:permission:edit', 'sys:permission:add')")
@RequestMapping(value="", method = {RequestMethod.PUT, RequestMethod.POST})
public String saveOrUpdate(SysPermission permission) {
sysPermissionService.saveOrUpdate(permission);
return "redirect:/permission";
}
/**
* 删除權限資源,及其權限資源下的子資源
* @param id
* @return
*/
@PreAuthorize("hasAuthority('sys:permission:delete')")
@DeleteMapping("/{id}")
@ResponseBody
public MengxueguResult deleteById(@PathVariable("id") Long id) {
sysPermissionService.deleteById(id);
return MengxueguResult.ok();
}
}
# 業務層接口
public interface SysPermissionService extends IService<SysPermission> {
/**
* 通過權限id删除權限資源
* @param id
* @return
*/
boolean deleteById(Long id);
}
# 業務層實作
@Service
public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements SysPermissionService {
@Transactional
@Override
public boolean deleteById(Long id) {
// 1. 删除目前id的權限
baseMapper.deleteById(id);
// 2. 删除parent_id = id 的權限, 删除目前點選的子權限
LambdaQueryWrapper<SysPermission> queryWrapper = new LambdaQueryWrapper();
//delete from sys_permission where parent_id = #{id};
queryWrapper.eq(SysPermission::getParentId, id);
baseMapper.delete(queryWrapper);
return true;
}
}