【JavaWeb項目】一個眾籌網站的開發(六)后台用戶權限控制


登陸成功進入控制面板后

  • 左側的菜單是共同的元素,抽取出來做靜態包含
  • 要求必須是按照不同的用戶得到不同的菜單
  • 用戶做了權限限制,哪個用戶能操作哪些內容(鏈接、按鈕、內容)

一、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";
        }

    }
}

注冊后的網址變化了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM