自定义权限模块4——后端权限拦截

本篇博客接着上篇博客自定义权限模块3——后端代码实现,并在上篇博客项目的基础上进行改造。

  • 目录结构

这里写图片描述
这里写图片描述

  • 修改SecurityApplication.java
package com.xyc.security;

import com.xyc.security.interceptor.SecurityInterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.xyc.security.filter")/*扫描过滤器*/
public class SecurityApplication extends WebMvcConfigurerAdapter {
    public static void main(String[] args) {
        SpringApplication.run(SecurityApplication.class, args);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) { //注册权限拦截器
        registry.addInterceptor(new SecurityInterceptor());
    }
}
  • SecurityInterceptor.java
package com.xyc.security.interceptor;

import com.xyc.security.annotation.Module;
import com.xyc.security.annotation.Permission;
import com.xyc.security.bo.LoginUserInfo;
import com.xyc.security.common.Constant;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 权限拦截器,用于访问拦截进行权限排查
 * Created by xyc on 2017/8/13 0013.
 */
public class SecurityInterceptor extends HandlerInterceptorAdapter {
    /**
     * 在请求处理之前(Controller方法调用之前)进行调用
     *
     * @param request
     * @param response
     * @param handler
     * @return 只有返回true才会继续向下执行,返回false取消当前请求
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
         * 在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类、方法和参数的一个信息类,
         * 通过其两个构造函数我们就可以了解其功能,对应着springMVC的Controller来说就是某个url对应的某个Controller执行的方法。
         */
        if (handler.getClass() == HandlerMethod.class) {    //判断是否为Controller请求
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Class cls = handlerMethod.getBeanType();
            if (cls.isAnnotationPresent(Controller.class) || cls.isAnnotationPresent(RestController.class)) {   //是否是Controller
                Module module = (Module) cls.getAnnotation(Module.class);
                if (module != null) {   //如果有权限模块注解则进行权限判断
                    LoginUserInfo loginUserInfo = (LoginUserInfo) request.getSession(true).getAttribute(Constant.LOGIN_USER_INFO);  //获取登录用户信息
                    if (loginUserInfo == null || loginUserInfo.getMpInfoMap() == null || loginUserInfo.getMpInfoMap().isEmpty()) { //如果登录用户或者用户权限为空则取消当前请求
                        return false;
                    }

                    List<String> permissionList = loginUserInfo.getMpInfoMap().get(module.value());
                    if (permissionList == null || permissionList.isEmpty()) {    //登录用户权限模块的权限列表为空则取消当前请求
                        return false;
                    }
                    if (permissionList.contains(handlerMethod.getMethodAnnotation(Permission.class).value())) { //登录用户拥有此权限则继续向下执行
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}
  • 总结

以上就是自定义权限的实现代码了,基本的思想就这些,具体的实现就看大家的喜好了。

  • github

https://github.com/xiayongchao/security

  • 参考

http://blog.youkuaiyun.com/qq924862077/article/details/53789852
http://blog.youkuaiyun.com/catoop/article/details/50501696

### 关于 `vue-antd-admin` 的权限管理实现 在 `vue-antd-admin` 中,权限管理系统的设计紧密围绕着 Vue Router 和 Ant Design of Vue 组件库展开。为了确保不同角色的用户能够访问到各自应有的页面并执行特定的操作,该框架采用了基于路由的角色权限控制机制。 #### 路由级别的权限控制 通过自定义指令或守卫函数来拦截用户的请求路径,判断当前登录者是否有权进入所申请的目标视图。对于未授权的情况,则重定向至无权提示页或其他指定位置[^1]。 ```javascript // src/router/index.js 示例片段 import { createRouter, createWebHistory } from 'vue-router'; const routes = [ { path: '/', component: () => import('@/views/layout/Index'), children: [ { path: '', name: 'home', meta: { title: '首页', icon: 'dashboard' }, component: () => import('@/views/home') } ] } ]; const router = createRouter({ history: createWebHistory(), routes, }); router.beforeEach((to, from, next) => { const hasPermission = checkUserPermissions(to.meta.requiredAuth); if (!hasPermission && to.meta.requiresAuth) { next({ name: 'unauthorized' }); } else { next(); } }); ``` 此代码展示了如何利用 `beforeEach` 导航守卫来进行简单的权限验证逻辑。当用户尝试跳转到某个带有 `requiresAuth` 属性标记的路由时,会先调用 `checkUserPermissions()` 方法检查是否满足条件;如果不符则转向名为 `'unauthorized'` 的错误页面[^2]。 #### 动态加载菜单与按钮级权限 除了上述全局性的路由保护外,在实际应用开发过程中还经常涉及到更细粒度的权限设置——即针对具体功能模块内的操作项(如新增、编辑、删除等)。这通常借助于动态渲染技术配合后端API接口返回的数据完成个性化展示: - **菜单栏**:依据用户身份获取对应的导航链接列表; - **表单/表格中的按钮**:根据业务场景决定哪些交互控件应该被隐藏或者禁用状态。 这些细节处理往往需要前端工程师同服务端协作设计合理的数据交换协议以及相应的UI展现策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值