SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面
之前寫了關于SSM框架中利用Filter不登陸攔截訪問
如果用戶沒有登錄直接訪問的話
所有請求全部轉到登錄頁面登錄才可訪問
以此實現了初步的安全管理
之前去面試也是被問到了這個問題
ps:講真,現在真的有好多安全控件兒,用這個的還能有多少
好吧,作為基礎,畢竟筆者也是新人一枚
話說回來,講到之前面試被問到這個問題
也就是,在登錄成功之后,那么后續的
比如一些只有leader才能使用的管理頁面怎么去攔截呢
總不能你登錄之后,從某些渠道得到了內頁的登錄地址
然后直接輸入地址就可以訪問內頁了?
當然是不可能的
今天更新:小白篇:關于內頁訪問的權限校驗
當然還是使用Filter....畢竟別的筆者是真的不會啊,哈哈哈哈
上代碼:以之前的登錄攔截為基礎
SSM框架利用Filter實現頁面不登陸攔截,禁止跳過登錄強制訪問
今日代碼:
public class UrlFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO 對全棧url進行過濾//將request和response對象強轉為http類型HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse resp = (HttpServletResponse)response;//獲取訪問的地址String url = req.getRequestURI();//允許所有人訪問的地址,全部定義到數組中String[] urls={"tologin.do","login.do","error.do","logout.do","top.do","left.do","right.do"};//用來判斷用戶當前訪問地址是否在不登陸可訪問的權限內boolean contains=true;for(String u:urls){//url的截取7:因為我的uri根中是 “/dscms/” 共七個字符,根據個人情況,如果沒有,不用截取if(url.substring(7).equals(u)){contains=false;}}//獲取session中的對象判斷是否登錄//攔截所有的 .do 請求但不包含tologin.do//jsp文件已經封裝到webinf下 不用過濾 之過濾 .do請求即可if(url.contains(".do")&contains) {//獲取sessionHttpSession session = req.getSession();TUser user=(TUser) session.getAttribute("USER");if(user==null){//如果用戶為空,說明沒有登錄,返回到登錄頁面resp.sendRedirect("/dscms/tologin.do");chain.doFilter(req, resp);}else {//用戶不為空,說明用戶登錄了,訪問網址的時候驗證權限//驗證權限,如果當前訪問地址沒有在用戶權限范圍內提示地址錯誤if(chkPermission(req)){//繼續執行過濾連的剩余部分chain.doFilter(req, resp);}else {//沒有權限訪問,返回錯誤代碼或者自己定義的錯誤頁面resp.sendError(404);//resp.sendRedirect("../error.do");chain.doFilter(req, resp);}}}chain.doFilter(req, resp);}//判斷當前地址權限是否在用戶權限范圍內private boolean chkPermission(HttpServletRequest request){//1、獲取用戶當前訪問的uriString uri=request.getRequestURI().substring(7);//1.1 判斷當前uri訪問需要的權限id//截取當前uri對應的權限地址并查詢//根據權限地址查詢權限idSystem.out.println(uri);//獲取permission實例:filter中是無法自動注入的,因為這樣生成兩個該filter的實例A和B(A:tomcat之類的容器管理,B為spring管理)//2、獲取當前用戶的權限集合TUser user=(TUser)request.getSession().getAttribute("USER");List<TPermission> permissions = user.getPermissions();//遍歷用戶當前權限列表,判斷權限for(TPermission pers:permissions) {if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){if (pers.getUrl().equals(uri)) {//2.1 、判斷,如果當前uri的id在用戶權限集合中返回truereturn true;}}}//2.2、 如果不在權限中,返回falsereturn false;}@Overridepublic void destroy() {// TODO Auto-generated method stub}}之前的文章上面也發出來了
今天用的還是以之前的Filter類作為基礎
在用戶登錄之后,繼續加了一層驗證
也就是在判斷用戶已經登錄之后
if(user==null){//如果用戶為空,說明沒有登錄,返回到登錄頁面resp.sendRedirect("/dscms/tologin.do");chain.doFilter(req, resp);}else {//用戶不為空,說明用戶登錄了,訪問網址的時候驗證權限//驗證權限,如果當前訪問地址沒有在用戶權限范圍內提示地址錯誤if(chkPermission(req)){//繼續執行過濾連的剩余部分chain.doFilter(req, resp);}else {//沒有權限訪問,返回錯誤代碼或者自己定義的錯誤頁面resp.sendError(404);//resp.sendRedirect("../error.do");chain.doFilter(req, resp);}}也就是這里繼續校驗
下面封裝了一個chkPermission()方法
如果寫在一起實在顯得臃腫
//判斷當前地址權限是否在用戶權限范圍內private boolean chkPermission(HttpServletRequest request){//1、獲取用戶當前訪問的uriString uri=request.getRequestURI().substring(7);//1.1 判斷當前uri訪問需要的權限id//截取當前uri對應的權限地址并查詢//根據權限地址查詢權限idSystem.out.println(uri);//獲取permission實例:filter中是無法自動注入的,因為這樣生成兩個該filter的實例A和B(A:tomcat之類的容器管理,B為spring管理)//2、獲取當前用戶的權限集合TUser user=(TUser)request.getSession().getAttribute("USER");List<TPermission> permissions = user.getPermissions();//遍歷用戶當前權限列表,判斷權限for(TPermission pers:permissions) {if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){if (pers.getUrl().equals(uri)) {//2.1 、判斷,如果當前uri的id在用戶權限集合中返回truereturn true;}}}//2.2、 如果不在權限中,返回falsereturn false;}開始的時候本來是想要去校驗權限的id,但是后來發現其實用substring去截取著實更簡單一點(字符串真的操作真的很重要)平時要常看看
還有一點:filter中是不能使用Autowired的,如果需要使用注入的話,可以如下
ServletContext context = request.getServletContext();ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);SessionService sessionService = ctx.getBean(SessionService.class);還記得這個把,剛開始接觸spring的時候
通過been.xml去過去,怎么說呢,手動配置加載這樣
用框架多了,很多以前的基礎都忘了
基礎其實才是最重要的,框架千萬種,萬變不離其宗
只要基礎牢固,什么框架都不在話下
可是要是你只會框架,恐怕到時候真的遇到問題就真的老大難咯
最后:關于權限還有部分沒有實現——關于部分用戶擁有只讀權限,部分用戶擁有全部操作權限這部分,個人想法是在權限表中在多加一個字段,驗證的時候去驗證具體 只讀/操作,不知道大家有沒有什么更好的辦法,歡迎評論區討論留言哈
總結
以上是生活随笔為你收集整理的SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux安装RDKit
- 下一篇: 中文版Latex常用语法大全教程