一个系统正常使用的话当然不会发生权限问题,但是总有那个不正常使用的情况发生。我们不希望随随便便一个人就可以对本应该管理员操作的东西操作,这时,我们就应该加入权限判断。对非管理员的一些操作进行拦截。
在后台进行相应前先进行判断,阻止一些非正常的请求。这让我想到了以前学的后台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("无操作权限"); } }
权限管理阻止一些非正常访问,避免其他人利用系统漏洞进行违规操作。这里我就按照自己的想法进行编写,当然会有更加简单规范的方法等着我去发掘。