【JavaWeb项目】一个众筹网站的开发(六)后台用户权限控制

登陆成功进入控制面板后

  • 左侧的菜单是共同的元素,抽取出来做静态包含
  • 要求必须是按照不同的用户得到不同的菜单
  • 用户做了权限限制,哪个用户能操作哪些内容(链接、按钮、内容)

一、RBAC权限模型

权限:权利与限制

可以做什么和不可以做什么

权限管理是大部分软件系统都会涉及的,而且权限管理的需求本质往往是一样的,不同的角色拥有不同的权限,只要你充当了某个角色,你就拥有了相对应的功能。

  RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色域权限进行关联。简单而言,一个用户拥有若干角色,每个角色拥有若干权限,这样就形成了“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限(功能)之间,一般是多对多的关系。
五张表实现最简单的RBAC模型:
          用户:每个人都是一个用户;
          角色:公司(职务);系统(角色):如,管理员,会员,项目经理...
          权限:能操作哪些东西;
          
          举例: 我,秦始皇,钱;
                    我是谁?leifengyang(用户)
                    来到公司;职务 :讲师(角色)
                    能干什么?:  讲课,给学生解决问题;(权限)
         
多对多关系,需要一个中间表来进行关联:
          用户-----角色;(多对多)  一个用户有很多角色;一个角色下也是很多用户;    

                需要中间表:用户---用户_角色中间表---角色

          角色----权限(菜单)(多对多);一个角色能操作很多菜单;一个菜单很多角色都能操作
                需要中间表:角色(用户身份)---角色_权限_中间表---权限(菜单)
         
          RBAC:基于角色
          用户---(角色)---权限:用户如果直接对应权限,同一类的用户他们操作的菜单都一样,我们并没有将共同因素抽取出来,如果有100万个用户,每个用户都有很多权限,用户和权限直接对应,中              间表非常庞大臃肿
               直接对应;
                    layerui(弹出层插件)
 

扩展模型

 

 

 

 

 RBAC0

核心级别,其他级别都建立在该级别上

许可就是权限

会话就是场景

 

 

 场景和用户一一对应,场景和角色1对多,用户和角色是多对多

 

 

 

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

    }
}

注册后的网址变化了

 

posted on 2019-09-06 16:50  AI数据  阅读(875)  评论(0编辑  收藏  举报

导航