天天看點

權限資源管理

  • 在demo15的基礎上開發
# 使用注解控制權限,是以需要在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;
    }
    
}