4

前言

一个系统正常使用的话当然不会发生权限问题,但是总有那个不正常使用的情况发生。我们不希望随随便便一个人就可以对本应该管理员操作的东西操作,这时,我们就应该加入权限判断。对非管理员的一些操作进行拦截。

过滤器

在后台进行相应前先进行判断,阻止一些非正常的请求。这让我想到了以前学的后台token过滤器。先过滤一些请求,再进行转发,调用控制器中的特定方法。
首先我们来配置过滤器
首先我们来启用过滤器扫描功能。我们来到初始类,添加@ServletComponentScan注解,启用过滤器的扫描功能。然后新建一个过滤器类,加入@WebFiltrer注解来告诉spring,这是一个过滤器。

@WebFilter
public class PowerFilter extends HttpFilter {
}

权限判断

配置好过滤器后,我们进行权限判断,原教程是进行token验证,但是我们涉及权限,只希望拦截一部分请求。
首先我们获取请求的url

// 获取请求的url
String url = request.getRequestURI();
logger.info(url);

然后我们统计需要拦截的url,也就是希望只能管理员才能发出的请求。比如我们的给作业判成绩,重置密码,还有对实验以及学生的增删改查操作。我们先建立一个List<>容器,将我们需要进行身份判断的url放到里面。

List<String> powerUrls;
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    powerUrls.add("work/updateScore");
    powerUrls.add("item");
    powerUrls.add("user/resetPassword");
    powerUrls.add("Student");

然后我们对于非管理员操作的的需要验证权限的url进行验证,对于无权限的请求抛出异常。
这里用到了Java增强for循环,感觉有点像PHP的foreach循环。

if (!workService.isTeacher()) {
    for (String powerUrl: powerUrls) {
        if (url.contains(powerUrl)) {
            throw new AccessDeniedException("无操作权限");
        }
    }
}

最后转发数据,开始调用控制器中的特定方法

logger.info("在控制器被调用以前执行");

// 转发数据。spring开始调用控制器中的特定方法
chain.doFilter(request, response);

logger.info("在控制器被调用以后执行");

补充

如果我们想对一些url的特定请求方法进行拦截,我们需要建立二维数组,同时存放url和请求方法,并同时进行判断。
如果我们无希望一个学生对其他学生的东西进行修改,我们还应该加入对url参数值进行比较。这里request有一个getParameter("id")方法能够获取url里的id参数值。

if (url.contains("/Student")) {
    if (request.getParameter("id") != studentService.getCurrentStudent().getId().toString()) {
        logger.info("已拦截2");
        throw new AccessDeniedException("无操作权限");
    }
}

总结

权限管理阻止一些非正常访问,避免其他人利用系统漏洞进行违规操作。这里我就按照自己的想法进行编写,当然会有更加简单规范的方法等着我去发掘。


小强Zzz
1.2k 声望32 粉丝