欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-08-12

项目背景:最近自己再封装搭建一个简单的框架,里面用到了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;@Data@ApiModel("请求参数封装")public class RequestParameter implements Serializable { @ApiModelProperty("用户id") private String userId; @ApiModelProperty("用户名称") private String username; @ApiModelProperty("请求参数") private T data;}

接下来步入正题,这里我们要拿到所有的不需要被拦截的接口url。再注入到spring容器中。

这里面包含一个AllRequestUrl.methonConMustLogin(Methon methon)这个方法是用来判断如果这个方法或者是这个类上面包含MustLogin这个注解就返回true,否者就返回false。具体实现。

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 。其他的一些方便的工具类也最近在补充。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。