rbac

学习主题:rbac
学习目标:
1 掌握rbac

1.什么是RBAC

(1)请简述什么是RBAC
RBAC(Role-BasedAccessControl )基于角色的访问控制。
RBAC 认为权限的过程可以抽象概括为: 判断【Who 是否可以对 What 进行 How 的访问操作(Operator)】
Who:权限的拥用者或主体
What:权限针对的对象或资源
How:具体的权限
Operator:操作。
表明对 What 的 How 操作。也就是 Privilege+Resource Role:角色,一定数量的权限的集合。 权限分配的单位与载体,目的是隔离User与Privilege 的逻辑关系
(2)什么是RBAC96模型,还有别的模型吗,分别是什么?
RBAC0 RBAC1、 RBAC2、RBAC3

2.RBAC实战-需求分析和数据库设计

(1)简述为何要这么设计表结构
一个用户对于一个角色,一个角色对于多个用户。用户和角色是多对一的关系。
每个角色都有多个菜单,角色和菜单是多对多的关系,需要中间表将角色和菜单关联起来。一个菜单有多个功能,菜单和功能是一对多的关系。

3.RBAC实战-创建表

(1)将设计好的数据库表贴到下面
1创建用户表

CREATETABLE`users`( 
`username`varchar(50)NOTNULL, 
`userpwd`varchar(50)DEFAULTNULL,
 `role_id`int(11)DEFAULTNULL, 
 PRIMARYKEY(`username`),
 KEY`users_fk`(`role_id`), 
 CONSTRAINT`users_fk`FOREIGN KEY(`role_id`)
 REFERENCES`roles`(`roleid`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;


CREATETABLE`roles`(
 `roleid`int(11)NOTNULLAUTO_INCREMENT, 
 `rolename`varchar(50)DEFAULTNULL, 
  PRIMARYKEY(`roleid`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;


CREATETABLE`menus`(
 `menuid`int(11)NOTNULLAUTO_INCREMENT,
 `menuname`varchar(50)DEFAULTNULL, 
 `menuurl`varchar(50)DEFAULTNULL,
 `fatherid`int(11)DEFAULTNULL, 
 PRIMARYKEY(`menuid`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;

CREATETABLE`funs`(
  `funid`int(11)NOTNULLAUTO_INCREMENT, 
  `funname`varchar(50)DEFAULTNULL,
  `funurl`varchar(50)DEFAULTNULL, 
  `menu_id`int(11)DEFAULTNULL,
   PRIMARYKEY(`funid`),
   KEY`menus_fk`(`menu_id`), 
   CONSTRAINT `menus_fk` FOREIGN KEY (`menu_id`) 
   REFERENCES `menus` (`menuid`) )ENGINE=InnoDBDEFAULTCHARSET=utf8
    
CREATETABLE`roles_menus`( 
`roles_id`int(11)NOTNULL,
 `menus_id`int(11)NOTNULL, 
 PRIMARYKEY(`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=InnoDBDEFAULTCHARSET=utf8;

4.RBAC实战-添加基础数据

5.RBAC实战-ssm整合

(1)再次从零开始整合一下ssm框架

6.RBAC实战-创建pojo

(1)将创建好的pojo贴到下面,并解释类与类之间的关系.每个类中的属性分别是什么意思

package com.bjsxt.pojo;

import java.util.ArrayList;
import java.util.List;

public class Users {
    private String username;
    private String userpwd;
    private Roles roles;
    private List<Menus> menus=new ArrayList<>();
    private List<Funs> funs=new ArrayList<>();

    public List<Funs> getFuns() {
        return funs;
    }

    public void setFuns(List<Funs> funs) {
        this.funs = funs;
    }

    public List<Menus> getMenus() {
        return menus;
    }

    public void setMenus(List<Menus> menus) {
        this.menus = menus;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public Roles getRoles() {
        return roles;
    }

    public void setRoles(Roles roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {
        return "Users{" +
                "username='" + username + '\'' +
                ", userpwd='" + userpwd + '\'' +
                ", roles=" + roles +
                ", menus=" + menus +
                ", funs=" + funs +
                '}';
    }
}

package com.bjsxt.pojo;

import java.util.ArrayList;
import java.util.List;

public class Roles {
    private int roleid;
    private String rolename;
    private List<Menus> menus = new ArrayList<>();

    public int getRoleid() {
        return roleid;
    }

    public void setRoleid(int roleid) {
        this.roleid = roleid;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    public List<Menus> getMenus() {
        return menus;
    }

    public void setMenus(List<Menus> menus) {
        this.menus = menus;
    }
}

package com.bjsxt.pojo;

import java.util.ArrayList;
import java.util.List;

public class Menus {
    private int menuid;
    private String menuname;
    private String menuurl;
    private int fatherid;

    private List<Funs> funs =new ArrayList<>();

    public int getMenuid() {
        return menuid;
    }

    public void setMenuid(int menuid) {
        this.menuid = menuid;
    }

    public String getMenuname() {
        return menuname;
    }

    public void setMenuname(String menuname) {
        this.menuname = menuname;
    }

    public String getMenuurl() {
        return menuurl;
    }

    public void setMenuurl(String menuurl) {
        this.menuurl = menuurl;
    }

    public int getFatherid() {
        return fatherid;
    }

    public void setFatherid(int fatherid) {
        this.fatherid = fatherid;
    }

    public List<Funs> getFuns() {
        return funs;
    }

    public void setFuns(List<Funs> funs) {
        this.funs = funs;
    }
}

package com.bjsxt.pojo;

public class Funs {
    private int funid;
    private String funname;
    private String funurl;

    public int getFunid() {
        return funid;
    }

    public void setFunid(int funid) {
        this.funid = funid;
    }

    public String getFunname() {
        return funname;
    }

    public void setFunname(String funname) {
        this.funname = funname;
    }

    public String getFunurl() {
        return funurl;
    }

    public void setFunurl(String funurl) {
        this.funurl = funurl;
    }
}

7.RBAC实战-定义resultMap

(1)视频中定义resultMap的意义是什么?
我们在查询结果集时候,用的是多表关联查询,所以我们返回值必须是一个map来封装我们查询的结果

8.RBAC实战-用户登录

(1)用户在登录的时候,后台做了哪些业务逻辑处理
根据username先去查询数据库,如果查询到用户,我们在取出返回值的密码,与用户输入的密码是否一致,如果一致返回user,如果密码不一致,就抛出异常,返回密码有误,或用户名有误

9.RBAC实战-页面显示

(1)贴出首页布局的代码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title> 
</head>
 <frameset rows="15%,*,10%" border="1"> 
<frame src="head" scrolling="no" 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">
 </html>

(2)什么是Dtree,如何使用Dtree,后台需要注意什么?
菜单树形显示
首先引入js和css文件
然后创建form表单
(3)如何在页面中显示树形菜单?
使用add方法

10.RBAC实战-创建用户是否登录Filter

(1)为什么要检测用户是否登录?
为了防止用户不登录也能访问首页问题
(2)简述Filter的检测逻辑是什么
如果用户访问的是登录页面,放行
如果访问的不是登录页面,我们先从session中获取数据,判断是否登录,如果session中取出数据则可以放行,如果不能,则重定向到登录页面

11.RBAC实战-什么是越级访问

(1)简述什么是越级访问,如何改善?
通过浏览器地址栏访问越级的功能。使用RBAC的控制对象功能。

12.RBAC实战-录入资源管理基础数据

(1)将课堂上的代码敲一遍

13.RBAC实战-查询资源

(1)将课堂上的代码敲一遍,简述如何查询资源,后台的业务逻辑是如何的.
使用多表连接查询实现同过用户名查找对于的角菜单、功能等信息。查找到的数据封装进user对象中。

14.RBAC实战-创建权限过滤器

(1)创建权限过滤器的意义是什么?权限过滤器的业务逻辑是如何的?
判断当前用户是否有权限访问该资源,避免用户的越级访问。
先对静态资源放行,在对用户登录的资源进行放行,再判断当前访问的uri是否在用户的权限之内。使用for循环遍历user对象中存储的功能信息,判断当前uri与功能是否匹配。匹配则放行。不匹配则提示权限不足。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值