-
项目背景:最近自己再封装搭建一个简单的框架,里面用到了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;
}
- 接下来步入正题,这里我们要拿到所有的不需要被拦截的接口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;
}
- 接下来,拿到所有不需要被拦截的url,我们就可以通过反射的形式,执行SpringSecurity中的方法了。
- 就这么多了,其实东西比较少,就是一种思路,这思路不需要看源码啥的,大家有需要项目代码的可以到我的可以看我gitee项目。项目地址。
- 题外话:这个项目是因为我想学学前端,网上找视频。每次看着看着,那玩意后台就要收费。说是需要服务器费用啥的,然后自己最近也是在负责一个项目了,框架也是项目经理给的,我做了一个二次开发,工作这么多年没亲手自己搭建一个,说来有点惭愧啊,所以就自己亲手搭建了一个,没想到这玩意没亲手搞过不知道这玩意也是很烦人的,所以就搭了这么个框架。这里面就是实现了个jwt,还有一个Spring cache 。其他的一些方便的工具类也最近在补充。