RBAC


一、 什么是 RBAC

RBAC(Role-Based Access Control )基於角色的訪問控制。

 

RBAC 認為權限的過程可以抽象概括為:

判斷【Who 是否可以對 What 進行 How 的訪問操作(Operator)】

 

  • Who:權限的擁用者或主體
  • What:權限針對的對象或資源
  • How:具體的權限
  • Operator:操作。表明對 What 的 How 操作。也就是 Privilege+Resource
  • Role:角色,一定數量的權限的集合。權限分配的單位與載體,目的是隔離User與Privilege的邏輯關系

                         用戶角色 權限控制模型

二、 RBAC96 模型


1 RBAC 模型

RBAC96 模型家族,其中包括了 RBAC0~RBAC3 四個概念模型。

2 RBAC0


        定義了能構成一個 RBAC 控制系統的最小的元素集合在 RBAC 之中,包含用戶 users(USERS)、角色 roles(ROLES)、目標 objects(OBS)、操作operations(OPS)、許可權 permissions(PRMS)五個基本數據元素,權限被賦予角色,而不是用戶,當一個角色被指定給一個用戶時,此用戶就擁有了該角色所包含的權限。會話 sessions是用戶與激活的角色集合之間的映射。RBAC0 與傳統訪問控制的差別在於增加一層間接性帶來了靈活性,RBAC1、 RBAC2、RBAC3 都是先后在 RBAC0 上的擴展。


 

 

UA(User Assignment):用戶角色分配
PA(Permission Assignment):角色許可分配




3 RBAC1

引入角色間的繼承關系
角色間的繼承關系可分為一般繼承關系和受限繼承關系。一般繼承關系僅要求角色繼承關系是一個絕對偏序關系,允許角色間的多繼承。而受限繼承關系則進一步要求角色繼承關系是一個樹結構。

 

 

4 RBAC2


該模型中添加了責任分離關系


       RBAC2 的約束規定了權限被賦予角色時,或角色被賦予用戶時,以及當用戶在某一時刻激活一個角色時所應遵循的強制性規則。責任分離包括靜態責任分離和動態責任分離。約束與用戶-角色-權限關系一起決定了 RBAC2 模型中用戶的訪問許可。

 

 

5 RBAC3


RBAC3 包含了 RBAC1 和 RBAC2
既提供了角色間的繼承關系,又提供了責任分離關系

 

三、 RBAC 實戰


1 需求

  • 1)實現用戶登錄功能
  • 2)使用 RBAC0 模型管理系統權限
  • 3)對系統的菜單以及菜單中的鏈接進行管理。
  • 4)用戶登錄后首頁根據用戶角色顯示該角色所對應的菜單
  • 5)禁止用戶越級訪問

2 技術選擇

  • 1)框架:SpringMVC+Spring+Mybatis
  • 2)數據庫:Mysql

3 數據庫設計

 

4 創建表

 4.1創建用戶表

CREATE TABLE `users` (
`username` varchar(50) NOT NULL,

`userpwd` varchar(50) DEFAULT NULL,

`role_id` int(11) DEFAULT NULL,

PRIMARY KEY (`username`),

KEY `users_fk` (`role_id`),

CONSTRAINT `users_fk` FOREIGN KEY (`role_id`) REFERENCES `roles` (`roleid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4.2創建角色表


CREATE TABLE `roles` (
`roleid` int(11) NOT NULL AUTO_INCREMENT,

`rolename` varchar(50) DEFAULT NULL,

PRIMARY KEY (`roleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


4.3創建菜單表


CREATE TABLE `menus` (
`menuid` int(11) NOT NULL AUTO_INCREMENT,
`menuname` varchar(50) DEFAULT NULL,

`menuurl` varchar(50) DEFAULT NULL,

`fatherid` int(11) DEFAULT NULL,

PRIMARY KEY (`menuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


4.4創建功能表


CREATE TABLE `funs` (
`funid` int(11) NOT NULL AUTO_INCREMENT,

`funname` varchar(50) DEFAULT NULL,

`funurl` varchar(50) DEFAULT NULL,

`menu_id` int(11) DEFAULT NULL,

PRIMARY KEY (`funid`),

KEY `menus_fk` (`menu_id`),

CONSTRAINT `menus_fk` FOREIGN KEY (`menu_id`) REFERENCES `menus`
(`menuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


4.5創建菜單角色中間表


CREATE TABLE `roles_menus` (
`roles_id` int(11) NOT NULL,

`menus_id` int(11) NOT NULL,

PRIMARY KEY (`roles_id`,`menus_id`),

KEY `roles_menus_fk2` (`menus_id`),

CONSTRAINT `roles_menus_fk1` FOREIGN KEY (`roles_id`) REFERENCES `roles`
(`roleid`),

CONSTRAINT `roles_menus_fk2` FOREIGN KEY (`menus_id`) REFERENCES `menus`
(`menuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

5 編寫用戶登錄 Controller

 

5.1創建login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
  <h3><font color="red">${requestScope.msg}</font></h3>
    <form action="userLogin" method="post">
        用戶名<input type="text" name="username"><br>
        密碼<input type="password" name="userpwd"><br>
        <input type="submit" value="提交"><br>
    </form>
  </body>
</html>
View Code

 


5.2創建 LoginController

package com.controller;

import javax.servlet.http.HttpServletRequest;
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.exception.UsersException;
import com.pojo.Users;
import com.service.UserService;

@Controller
public class LoginController {
    @Autowired
    private UserService userService;
    
    @RequestMapping("/userLogin")
    public String userLogin(Users users,Model model,HttpServletRequest request){
        try{
            Users u=this.userService.userLongin(users.getUsername(), users.getUserpwd());
              HttpSession session = request.getSession();
              session.setAttribute("user", u);
              
        }catch(UsersException e){
            e.printStackTrace();
            model.addAttribute("msg", e.getMessage());
            return "/login";
        }
        return "redirect:/index";
    }
}
View Code

6 頁面布局

6.1 index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

</head>

<frameset rows="15%,*,10%" border="1">
    <frame src="head" scrolling="auto" name="head">
<frameset cols="20%">
    <frame src="menu" scrolling="auto" name="menu">
    <frame src="body" scrolling="auto" name="body">
</frameset>
    <frame src="foot" scrolling="auto" name="foot">
</frameset>
</html>
View Code


免責聲明!

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



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