项目背景:最近自己再封装搭建一个简单的框架,里面用到了SpringSecurity,所以也就有了前面两篇文章,这期文章是要说在搭建的过程中,每次写Controller的时候,假如这个接口不需要登录就可以访问,是不是还要在配置文件中配置一下,这种方式如果在url比较多的时候是比较麻烦的。这里给大家一个实现的思路。也不需要懂源码,是比较好理解的一种方式。
这里主要是解决这种下图这种繁重的配置方式。如果太多需要放行的url,下面就会有一长串。
思路:刚开始也看了一阵源码。网上看到的一篇文章,他说FilteProxy…反正是这个类了,具体是什么名字我忘记了,反正也是看了半天也没看懂。我的思路是先拿到所有的url,然后判断该url的方法上是否包含自定义注解的形式去判断改方法是否需要被拦截。也就是这里需要用到反射。下面我们来看一下我是如何实现的。
首先要看的是在一般的项目中我们是如何配置的。这下面的这个类是实现WebSecurityConfigurerAdapter的一个配置类。
4.首先我们需要自定义一个注解。顺带介绍一下我这个注解还有其他的一些小功能。自定义的注解MustLogin。见名知意,这个注解就是说,如果在类上面写,就是说该类下面的所有方法都需要登录才可以访问,如果在方法上写,就说明这个方法需要登录才可以访问。
先说我这个注解的另外一个功能。主要是为了实现在需要登录接口参数中自动注入当前用户名和用户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; }
/** * 判断这个方法是否包含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; }