基于拦截器的后端资源权限实现

权限实现是web应用项目永远绕不开的话题,诸如SpringSecurity、Shiro等安全框架也提供了相对健全的解决方案。但如果摒弃这些框架单从功能实现出发实现多账户多角色的权限分管其实思路也很简单。

思路分析
后端实现(接口资源管理)
针对后端开发,基于springboot,我们可以采用拦截器与自定义注解配合实现 面向用户的 后台接口资源的管理。在用户登录时,将该账户可用的接口资源路径以某种形式存放在缓存中,当接口请求发起时,拦截器解析该账户所拥有的接口资源路径并与请求体路径相比对。这样,只需管理好用户与后台接口资源路径的对应关系在一定意义上就实现了针对用户的能力(即后台权限)的管理。

当然,针对后台接口资源实现面向用户的分管并不是非拦截器不可,同样的道理,我们采用AOP或过滤器实现 理论上也是可行的,总体思路都是在请求访问时做鉴权回应。后面我们会着重针对拦截器实现和AOP实现 两种实现方式做代码分析。

前端实现(组件资源可见/可操作)
针对前端开发,思路上可以通过解析用户的权限资源(这里要求后端有权限相关的库表设计)来对前端组件的可见性/可操作性进行管控。这部分不是本篇论述的重点,点到为止,不做赘述。

基于拦截器实现后端资源权限管理
以下代码在springboot中实现。用户登录的信息(授权接口资源等)缓存(session或自定义cookie)的编写这里不做介绍,各位可以按自己的思路实现,只要能够在请求体中解析即可。

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private ReqInterceptor reqInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { }
@Override
public void addInterceptors(InterceptorRegistry registry) {
//在 WebConfigurer 中的 addInterceptors 中添加拦截,放行
// addPathPatterns(”
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RightAnno {
public boolean value() default true; //true表示被标注的方法参与后台资源管控
}
3. 编写拦截器
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class ReqInterceptor implements HandlerInterceptor {

@Autowired
private LoginUserUtil loginUserUtil;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {<!-- -->
    log.info("&#x8FDB;&#x5165;&#x62E6;&#x622A;&#x5668;");
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    //1.&#x83B7;&#x53D6;&#x76EE;&#x6807;&#x7C7B;&#x4E0A;&#x7684;&#x76EE;&#x6807;&#x6CE8;&#x89E3;&#xFF08;&#x53EF;&#x5224;&#x65AD;&#x76EE;&#x6807;&#x7C7B;&#x662F;&#x5426;&#x5B58;&#x5728;&#x8BE5;&#x6CE8;&#x89E3;&#xFF09;
    RequestMapping reqMappingClass = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), RequestMapping.class);
    //2.&#x83B7;&#x53D6;&#x76EE;&#x6807;&#x65B9;&#x6CD5;&#x4E0A;&#x7684;&#x76EE;&#x6807;&#x6CE8;&#x89E3;&#xFF08;&#x53EF;&#x5224;&#x65AD;&#x76EE;&#x6807;&#x65B9;&#x6CD5;&#x662F;&#x5426;&#x5B58;&#x5728;&#x8BE5;&#x6CE8;&#x89E3;&#xFF09;
    RequestMapping reqMappingMethod = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), RequestMapping.class);
    RightAnno rightAnno = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), RightAnno.class);
    //&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x4E0A;&#x662F;&#x5426;&#x6709;&#x81EA;&#x5B9A;&#x4E49;&#x6CE8;&#x89E3;&#x4E14;&#x6CE8;&#x89E3;&#x503C;&#x4E3A;true,&#x5982;&#x8FC7;&#x662F;&#xFF0C;&#x5F00;&#x542F;&#x9274;&#x6743;
    if (rightAnno!=null&&rightAnno.value()){<!-- -->

// BiUser loginUser = loginUserUtil.getBiUserByCookie(request);
// Integer hrId = loginUser.getHrId();//请求人hrid
// log.info(hrId.toString());
log.info(“批准执行拦截”);
log.info(“reqClass==”+reqMappingClass);
log.info(“reqMethod==”+reqMappingMethod);
log.info(“inMethod==”+rightAnno);
log.info(“thePath==”+reqMappingClass.value()[0]+reqMappingMethod.value()[0]);
//这里编写解析你的用户资源,根据条件控制返回值,返回false则请求被拦截

        return true;
    }
    return true;
}

}
4. controller实例
@RequestMapping(“/listHighRightCountViewInfo.do”)
@ResponseBody
@RightAnno
public ResponseResult listHighRightCountViewInfo(@RequestBody JSONObject inJson, HttpServletRequest request){

}

基于AOP实现后端资源权限管理

Original: https://blog.csdn.net/zl5186888/article/details/126967718
Author: 籽麟网络
Title: 基于拦截器的后端资源权限实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542247/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球