登陸成功進入控制面板后
- 左側的菜單是共同的元素,抽取出來做靜態包含
- 要求必須是按照不同的用戶得到不同的菜單
- 用戶做了權限限制,哪個用戶能操作哪些內容(鏈接、按鈕、內容)
一、RBAC權限模型
權限管理是大部分軟件系統都會涉及的,而且權限管理的需求本質往往是一樣的,不同的角色擁有不同的權限,只要你充當了某個角色,你就擁有了相對應的功能。
RBAC(Role-Based Access Control,基於角色的訪問控制),就是用戶通過角色域權限進行關聯。簡單而言,一個用戶擁有若干角色,每個角色擁有若干權限,這樣就形成了“用戶-角色-權限”的授權模型。在這種模型中,用戶與角色之間,角色與權限(功能)之間,一般是多對多的關系。

用戶:每個人都是一個用戶;角色:公司(職務);系統(角色):如,管理員,會員,項目經理...權限:能操作哪些東西;舉例: 我,秦始皇,錢;我是誰?leifengyang(用戶)來到公司;職務 :講師(角色)能干什么?: 講課,給學生解決問題;(權限)用戶-----角色;(多對多) 一個用戶有很多角色;一個角色下也是很多用戶;用戶---用戶_角色中間表---角色角色----權限(菜單)(多對多);一個角色能操作很多菜單;一個菜單很多角色都能操作角色(用戶身份)---角色_權限_中間表---權限(菜單)RBAC:基於 角色用戶---(角色)---權限:用戶如果直接對應權限,同一類的用戶他們操作的菜單都一樣,我們並沒有將共同因素抽取出來,如果有100萬個用戶,每個用戶都有很多權限,用戶和權限直接對應,中 間表非常龐大臃腫直接對應;layerui(彈出層插件)
擴展模型
RBAC0
核心級別,其他級別都建立在該級別上
RBAC1
進行了角色的分層,角色有上下級關系
RBAC2基於RBAC0,進行了角色的訪問控制
RBAC3
最全面的權限管理,基於RBAC0的基礎上,將RBAC1和RBAC2進行了整合
二、ztree
zTree 是一個依靠 jQuery 實現的多功能 “樹插件”。優異的性能、靈活的配置、多種功能的組合是 zTree 最大優點
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> <script type="text/javascript" src="zTree_v3-3.5.28/js/jquery.ztree.all.js"></script> <link rel="stylesheet" href="zTree_v3-3.5.28/css/zTreeStyle/zTreeStyle.css" /> </head> <body> <h1>樹形結構</h1> <ul id="myztree" class="ztree"></ul> </body> <script> //ztree的一些設置 var setting = { data: { simpleData:{ enable: true } } }; var zNodes =[ {id:1, pId:0, name:"系統權限菜單", open:true}, {id:2, pId:1, name:"控制面板"}, {id:3, pId:1, name:"消息管理"}, {id:4, pId:1, name:"權限管理"}, {id:5, pId:4, name:"用戶管理"}, {id:6, pId:4, name:"角色維護"}, {id:7, pId:4, name:"許可維護"}, ]; $(function(){ $.fn.zTree.init($("#myztree"), setting, zNodes); }) </script> </html>
三、處理重定向
注冊完,進入控制面板,刷新后會重新提交表單
要用重定向
重定向的main.jsp在WEB-INF的manager文件夾下
需要寫一個處理重定向請求的控制器
package com.atguigu.scw.manager.controller; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.atguigu.scw.manager.constant.Constants; @Controller public class DispatcherController { // 偽靜態化效果 @RequestMapping(value = "/main.html") public String toMainPage(HttpSession session) { // 校驗,只有登陸的用戶才可以到main // 判斷session中是否有這個用戶,如果沒有去登錄頁面 Object object = session.getAttribute(Constants.LOGIN_USER); if (object == null) { // 用戶沒登陸 return "redirect:/login.jsp"; }else { // 用戶登陸 return "manager/main"; } } }
UserController中的return "manager/main";均改為return "redirect:/main.html";
package com.atguigu.scw.manager.controller.permission; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.atguigu.scw.manager.bean.TUser; import com.atguigu.scw.manager.constant.Constants; import com.atguigu.scw.manager.service.UserService; //處理所有/permission/user下的請求 @RequestMapping("/permission/user") @Controller public class UserController { private final String MANAGER_MAIN = "manager/main"; @Autowired UserService userService; @RequestMapping("/login") public String login(TUser user, HttpSession session) { // 登陸后返回的用戶要放在session中,用TUser TUser login = userService.login(user); if (login == null) { // 登陸失敗 session.setAttribute("errorUser", user); session.setAttribute("msg", "登陸失敗"); return "redirect:/login.jsp"; } // 登陸成功 // 1.將用戶放在session中 session.setAttribute(Constants.LOGIN_USER, login); return "redirect:/main.html"; } // /permission/user/reg @RequestMapping("/reg") public String reg(TUser user, Model model, HttpSession session) { System.out.println("用戶注冊..." + user); // 1.注冊成功后來到控制面板頁面 // 1.注冊用戶 boolean flag = userService.register(user); if (flag == true) { // 1.注冊成功,來到控制面板 // 用戶保存的數據在user對象中,id是數據庫生成的自增主鍵 // 需要修改mybatis的mapper文件,讓其使用自動生成的id session.setAttribute(Constants.LOGIN_USER, user); return "redirect:/main.html"; } else { // 2.注冊失敗 model.addAttribute("regError", "用戶名已經被使用"); // 3.來到頁面要回顯user之前輸入的內容 // 4.user先從隱含模型中拿的;只要pojo,確定完值以后會自動放在隱含模型中 // 用的key是類名首字母小寫${tUser.loginacct } return "forward:/reg.jsp"; } } }
注冊后的網址變化了