一個系統正常使用的話固然不會發生權限問題,可是總有那個不正常使用的狀況發生。咱們不但願隨隨便便一我的就能夠對本應該管理員操做的東西操做,這時,咱們就應該加入權限判斷。對非管理員的一些操做進行攔截。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