一个系统正常使用的话固然不会发生权限问题,可是总有那个不正常使用的状况发生。咱们不但愿随随便便一我的就能够对本应该管理员操做的东西操做,这时,咱们就应该加入权限判断。对非管理员的一些操做进行拦截。spring
在后台进行相应前先进行判断,阻止一些非正常的请求。这让我想到了之前学的后台token过滤器。先过滤一些请求,再进行转发,调用控制器中的特定方法。
首先咱们来配置过滤器
首先咱们来启用过滤器扫描功能。咱们来到初始类,添加@ServletComponentScan
注解,启用过滤器的扫描功能。而后新建一个过滤器类,加入@WebFiltrer
注解来告诉spring,这是一个过滤器。数组
@WebFilter public class PowerFilter extends HttpFilter { }
配置好过滤器后,咱们进行权限判断,原教程是进行token验证,可是咱们涉及权限,只但愿拦截一部分请求。
首先咱们获取请求的urlide
// 获取请求的url String url = request.getRequestURI(); logger.info(url);
而后咱们统计须要拦截的url,也就是但愿只能管理员才能发出的请求。好比咱们的给做业判成绩,重置密码,还有对实验以及学生的增删改查操做。咱们先创建一个List<>容器,将咱们须要进行身份判断的url放到里面。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循环。code
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参数值。token
if (url.contains("/Student")) { if (request.getParameter("id") != studentService.getCurrentStudent().getId().toString()) { logger.info("已拦截2"); throw new AccessDeniedException("无操做权限"); } }
权限管理阻止一些非正常访问,避免其余人利用系统漏洞进行违规操做。这里我就按照本身的想法进行编写,固然会有更加简单规范的方法等着我去发掘。get