编程语言
首页 > 编程语言> > SpringSecurity动态实现拦截url请求(不需要理解太多SpringSecurity源码)

SpringSecurity动态实现拦截url请求(不需要理解太多SpringSecurity源码)

作者:互联网

  1. 项目背景:最近自己再封装搭建一个简单的框架,里面用到了SpringSecurity,所以也就有了前面两篇文章,这期文章是要说在搭建的过程中,每次写Controller的时候,假如这个接口不需要登录就可以访问,是不是还要在配置文件中配置一下,这种方式如果在url比较多的时候是比较麻烦的。这里给大家一个实现的思路。也不需要懂源码,是比较好理解的一种方式。
    这里主要是解决这种下图这种繁重的配置方式。如果太多需要放行的url,下面就会有一长串。
    在这里插入图片描述

  2. 思路:刚开始也看了一阵源码。网上看到的一篇文章,他说FilteProxy…反正是这个类了,具体是什么名字我忘记了,反正也是看了半天也没看懂。我的思路是先拿到所有的url,然后判断该url的方法上是否包含自定义注解的形式去判断改方法是否需要被拦截。也就是这里需要用到反射。下面我们来看一下我是如何实现的。

  3. 首先要看的是在一般的项目中我们是如何配置的。这下面的这个类是实现WebSecurityConfigurerAdapter的一个配置类。
    在这里插入图片描述
    4.首先我们需要自定义一个注解。顺带介绍一下我这个注解还有其他的一些小功能。自定义的注解MustLogin。见名知意,这个注解就是说,如果在类上面写,就是说该类下面的所有方法都需要登录才可以访问,如果在方法上写,就说明这个方法需要登录才可以访问。
    在这里插入图片描述
    在这里插入图片描述

  4. 先说我这个注解的另外一个功能。主要是为了实现在需要登录接口参数中自动注入当前用户名和用户id。方便去实现一些需要用户名作为参数的方法。主要是方便开发啊。当然了也可以自己去从SpringSecurityHolder中拿用户信息。或者token中拿也都行。
    在这里插入图片描述

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @author wangcw
 * @Description TODO
 * @data 2021/11/2
 */
@Data
@ApiModel("请求参数封装")
public class RequestParameter<T> implements Serializable {
    @ApiModelProperty("用户id")
    private String userId;
    @ApiModelProperty("用户名称")
    private String username;
    @ApiModelProperty("请求参数")
    private T  data;

}

  1. 接下来步入正题,这里我们要拿到所有的不需要被拦截的接口url。再注入到spring容器中。
    在这里插入图片描述
    这里面包含一个AllRequestUrl.methonConMustLogin(Methon methon)这个方法是用来判断如果这个方法或者是这个类上面包含MustLogin这个注解就返回true,否者就返回false。具体实现。
/**
     * 判断这个方法是否包含MustLogin注解,或者是这个类面是否包含MustLogin注解
     * @param method
     * @return
     */
    public static Boolean methonConMustLogin(Method method){
        if(method.getAnnotation(MustLogin.class)!=null){
            return true;
        }
        Class<?> declaringClass = method.getDeclaringClass();
        if(declaringClass.getAnnotation(MustLogin.class)!=null){
            return true;
        }
        return false;
    }
  1. 接下来,拿到所有不需要被拦截的url,我们就可以通过反射的形式,执行SpringSecurity中的方法了。
    在这里插入图片描述
  2. 就这么多了,其实东西比较少,就是一种思路,这思路不需要看源码啥的,大家有需要项目代码的可以到我的可以看我gitee项目。项目地址
  3. 题外话:这个项目是因为我想学学前端,网上找视频。每次看着看着,那玩意后台就要收费。说是需要服务器费用啥的,然后自己最近也是在负责一个项目了,框架也是项目经理给的,我做了一个二次开发,工作这么多年没亲手自己搭建一个,说来有点惭愧啊,所以就自己亲手搭建了一个,没想到这玩意没亲手搞过不知道这玩意也是很烦人的,所以就搭了这么个框架。这里面就是实现了个jwt,还有一个Spring cache 。其他的一些方便的工具类也最近在补充。

标签:需要,url,MustLogin,SpringSecurity,源码,注解,这个,方法
来源: https://blog.csdn.net/baidu_40492134/article/details/122784555