提示:大牛大佬们就没必要垂阅了,如果很幸运的被大佬翻牌了,也希望能够给出指教。3Q
关于权限控制即包含功能权限+数据权限
我们使用的方式可谓多种多样:通过自定义注解编写AOP方式或是使用第三方提供好的框架如 shiro 或 springsecurity 等。这里总结的是我自己实际项目开发中使用的自定义过滤器的方式实现权限控制(认证服务会分开说)。
为什么要使用过滤器而不使用拦截器
说明,实际两者都是可以实现权限过滤与控制,并无较大的实际区别。
intercept(拦截器)是基于反射机制实现,应用功能比较全面,访问 action 上下文对象,获取 spring 容器中的对象,在 action 生命周期中可以调用多次。这些都是 filter 无法做到或者只能做一次的。但是 filter 的有点在于可以拦截几乎一切请求,这取决于我们的配置(以往有.xml文件时候的path配置如:/,现在springboot使用注解方式的配置 @WebFilter(urlPattens="/")道理相同)。而拦截器只限拦截 action 请求,基于这点我们选择适用性更强的 Filter。
本次是微服务项目 基于springcloud+springboot+springMVC+Mybatis-Plus等技术
简单说明拦截流程
就是请求进入后台服务器之前需要先去认证服务器进行认证。通过token认证后方可继续向下执行。
我们的 filter 就是在认证之后到后台服务之间;
拦截范围是 /* (全部请求)
下面是自定义的拦截器代码
@Component
@WebFilter(urlPatterns = "/*", filterName = "ruleFilter")
public class RuleFilter implements Filter {
// 注入缓存Redis
@Autowired
private RedisUtil redisUtil;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
// 首先转换 request 与 response
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
RuleService ruleService = SpringContextHolder.getBean(RuleService.class);
// 获取请求的URL
String servletPath = request.getServletPath();
// 获取请求方式 POST 需要使用流操作
String reqMethod = request.getMethod();
ServletRequest requestWrapper = new RuleFilterHttpServletRequestWrapper(request);
// 判断URL权限池是否包含 当前访问的URL 如果包含 则需要判断权限 如果不包含则不需要权限访问
boolean ruleURLList1 = redisUtil.hasKey("ruleURLList");
List<String> ruleURLList = new ArrayList<>();
if (ruleURLList1){
Object ruleURLs = redisUtil.get("ruleURLList");
if (null != ruleURLs){
ruleURLList = (List<String>) ruleURLs;
}
}
// 判断如果ruleURLList为空需要重新查询
if (!ruleURLList1 || 0 == ruleURLList.size()){
// 重新查询
List<String> strings = ruleService.finAllRuleUrl();