SSM实现权限管理(三)

简介: SSM实现权限管理(三)

一. 准备阶段


一.一 数据库准备阶段


准备与上一章节的数据库结构和内容都一样,只是将权限表 privilege 的url 地址改变了一下,由 servlet 访问路径改变成了 springmvc 访问路径。

20200511134639275.png

一.二 SSM框架搭建和前端页面


SSM框架,采用 Maven 方式进行搭建,所用到依赖和配置文件,均采用SSM整合时的内容,


详细可以看: Maven整合SSM项目(七)


页面也采用上一章节的页面信息。


框架搭建后的目录结构如图所示:


20200511134648125.png


二. 权限认证


二.一 认证和授权


二.一.一 认证


二.一.一.一 认证的 前端js 页面


html 页面:


2020051113473546.png


脚本代码:


$(function(){
    $("#submit").click(function(){
      var code=$("#code").val();
      var password=$("#password").val();
      var info=new Object();
      //传入进去,员工的id编号
      info.code=code;
      info.password=password;
      $.post("${pageContext.request.contextPath}/User/login",info,function(data){
        if(data.response_status){
          alert("登录成功");
          window.location.href="${pageContext.request.contextPath}/Main/toMain";
        }else{
          if(data.error_msg=="001"){
            alert("用户名或者密码错误");
          }
        }
      },"json")
    })
  })


二.一.一.二 后端登录处理


在 UserAction 下面的 login() 方法里面。


@RequestMapping("/login")
  @ResponseBody
  public Map<String,Object> login(User userInfo,HttpSession session){
    //将请求信息,封装到对象里面。
    Map<String,Object> map=new HashMap<String,Object>();
    //从数据库中查询密码
    User user=userService.login(userInfo);
    if(user!=null){
      //说明登录成功,放置到session里面
      session.setAttribute("loginUser",user);
      //查询一下,该员工的 按钮权限信息。
      List<Privilege> privilegeList= privilegeService.getPrivilegeByUId(user.getId(),2);
      List<String> priCodeList=new ArrayList<String>();
      for(Privilege pri:privilegeList){
        if(pri.getPercode()!=null){
          //放置标识
          priCodeList.add(pri.getPercode());
        }
      }
      //将权限转换成 json 字符串
      ObjectMapper objMapper=new ObjectMapper();
      Map<String,List<String>> priCodeMap=new HashMap<String,List<String>>();
      priCodeMap.put("data", priCodeList);
      String priValueString="";
      try {
        priValueString = objMapper.writeValueAsString(priCodeMap);
      } catch (JsonProcessingException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
      session.setAttribute("privilegeList",priValueString);
      //登录成功
      map.put("response_status", true);
    }else{
      //代码为001,表示用户名或者密码错误
      map.put("response_status", false);
      map.put("error_code","101");
    }
    return map;
  } 


二.一.二 授权


二.一.二.一 左侧菜单展示


1.html 页面元素


20200511134804735.png


2.js 脚本处理


20200511134809752.png


3.后端的 Mapper 查询, 在 PrivilgeMapper.xml 里面。


 <select id="findByUid" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from privilege a where a.id in (
    select rp.pid from user_role ur left join role_privilege rp
    on ur.rid=rp.rid
    where ur.uid=#{uId,jdbcType=INTEGER}
  )
  <if test="type != null and type !=''" >
      and a.type=#{type,jdbcType=INTEGER}
    </if>
  </select>


二.一.二.二 部门表按钮显示


与前面是一致的.


1 . 设置标识


<script>
    //获取权限 
    var privilegeList='<%=session.getAttribute("privilegeList")%>'; 
    //console.log("值是:"+privilegeList+","+typeof(privilegeList));
    var objPrivilegeList=JSON.parse(privilegeList);
    $.each(objPrivilegeList.data,function(idx,item){
      //将标识存放在 sessionStorage 里面,进行暂时的保存。 
      sessionStorage.setItem(item,true);
    })
  </script>
<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/dept.js"></script>


2 . 通过标识,对部门表的按钮元素进行显示或者隐藏


20200511134833337.png


二.二 权限验证测试


通过对 admin,yuejl,yuezl 三个不同的角色进行登录,可以正常地相应的菜单权限和按钮权限。


也同样,需要处理过滤器,只是在 SpringMVC 里面,叫做拦截器。


关于拦截器的使用,可以看老蝴蝶以前写得文章: SpringMVC的拦截器(十四)


二.三. 登录和授权拦截器


二.三.一 编写拦截器 LoginInterceptor


package com.yjl.action;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.yjl.pojo.Privilege;
import com.yjl.pojo.User;
import com.yjl.service.PrivilegeService;
/**
 * 
 * @author 两个蝴蝶飞
 *
 * 登录和授权拦截器
 */
public class LoginInterceptor implements HandlerInterceptor{
  @Autowired
  private PrivilegeService privilegeService;
  //不需要登录验证的url
    private static List<String> noLoginValidateUrl;
    //不需要权限验证的url
    private static List<String> noPriValidateUrl;
    //跳转到的登录页面
    private static String LOGIN_URL;
    //没有权限的界面
    private static String NO_PRIVILEGE_URL;
    static{
      noLoginValidateUrl=new ArrayList<String>();
      //静态资源
      noLoginValidateUrl.add("/static/");
      //登录页面
      noLoginValidateUrl.add("/User/toLogin");
      //登录方法
      noLoginValidateUrl.add("/User/login");
      noPriValidateUrl=new ArrayList<String>();
      noPriValidateUrl.add("/Main/toMain");
      //查询权限
      noPriValidateUrl.add("/Privilege/getPrivilegeByUId");
      //退出
      noPriValidateUrl.add("/User/logout");
      LOGIN_URL="/WEB-INF/jsp/login.jsp";
      NO_PRIVILEGE_URL="/WEB-INF/jsp/noPrivilege.jsp";
    }
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    // TODO 自动生成的方法存根
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    // TODO 自动生成的方法存根
  }
  @Override
  public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
    //获取Session
    HttpSession session=req.getSession();
    //请求路径
    String realPath=req.getRequestURI();
    System.out.println("地址是:"+realPath);
    //验证是否在 不需要验证登录的url里面
    if(isContain(realPath,1)){
      return true;
    }
    //如果为空,表示没有登录
    if(session.getAttribute("loginUser")==null){
      req.getRequestDispatcher(LOGIN_URL).forward(req,resp);
      return false;
    }else{
      //不需要验证权限
      if(isContain(realPath,2)){
        return true;
      }
      //如果不为空,表示登录了。
      //重新获取全部权限 , 需要缓存, 这儿不用缓存。
      User user=(User)session.getAttribute("loginUser");
      List<Privilege> privilegeList=privilegeService.getPrivilegeByUId(user.getId(),null);
      if(privilegeList!=null&&privilegeList.size()>0){
        boolean isHavePri=false;
        for(Privilege pri:privilegeList){
          if(pri.getUrl()!=null){
            if(realPath.contains(pri.getUrl())){
              isHavePri=true;
              break;
            }
          }
        }
        if(isHavePri){
          //放行
          return true;
        }else{
          req.getRequestDispatcher(NO_PRIVILEGE_URL).forward(req,resp);
          return false;
        }
      }
      return false;
    }
  }
  private boolean isContain(String realPath,int type){  
    List<String> urls;
    if(type==1){
      urls=noLoginValidateUrl;
    }else{
      urls=noPriValidateUrl;
    }
    boolean flag=false;
    for(String url:urls){
      //包括,返回-1
      if(realPath.indexOf(url)!=-1){
        flag=true;
        break;
      }
    }
    return flag;
  }
}


二.三.二 配置拦截器


在springmvc.xml 配置文件中进行配置


20200511134847170.png


按照上一章节的方式进行测试,发现测试正确,不同的用户具有不同的角色,老蝴蝶这儿就不再次贴图了。


本章节的代码链接为:


链接:https://pan.baidu.com/s/1PChrWK9l02ANccerzc7rsg 
提取码:iwvj


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
存储 Java 关系型数据库
ssm026校园美食交流系统(文档+源码)_kaic
本文介绍了基于Java语言和MySQL数据库的校园美食交流系统的设计与实现。该系统采用B/S架构和SSM框架,旨在提高校园美食信息管理的效率与便捷性。主要内容包括:系统的开发背景、目的及内容;对Java技术、MySQL数据库、B/S结构和SSM框架的介绍;系统分析部分涵盖可行性分析、性能分析和功能需求分析;最后详细描述了系统各功能模块的具体实现,如登录、管理员功能(美食分类管理、用户管理等)和前台首页功能。通过此系统,管理员可以高效管理美食信息,用户也能方便地获取和分享美食资讯,从而提升校园美食交流的管理水平和用户体验。
|
Java 关系型数据库 MySQL
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
本文针对高校体育场管理系统的开发与实现进行详细介绍。随着经济快速发展,人们对手机软件需求增加,高校体育场管理系统应运而生。系统采用JAVA技术、Mysql数据库和SSM框架等成熟技术,通过分析功能需求、可行性及性能,设计出包含管理员、用户和学生角色的功能模块。系统实现用户注册登录、信息管理等功能,简化传统手工统计模式,提高管理效率,满足用户对信息获取的及时性与准确性需求。
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
|
前端开发 Java 关系型数据库
基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
644 17
|
前端开发 Java 关系型数据库
基于ssm的超市会员(积分)管理系统,附源码+数据库+论文,包安装调试
本项目为简单内容浏览和信息处理系统,具备管理员和员工权限。管理员可管理会员、员工、商品及积分记录,员工则负责积分、商品信息和兑换管理。技术框架采用Java编程语言,B/S架构,前端使用Vue+JSP+JavaScript+Css+LayUI,后端为SSM框架,数据库为MySQL。运行环境为Windows,JDK8+Tomcat8.5,非前后端分离的Maven项目。提供演示视频和详细文档,购买后支持免费远程安装调试。
816 19
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
588 17
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
448 10
|
前端开发 Java 关系型数据库
基于ssm的台球厅管理系统,附源码+数据库+论文
本项目为新锐台球厅管理系统,支持管理员和会员两种角色。管理员可进行会员管理、台球桌管理、订单管理等;会员可查看台球桌、预约、购买商品等。技术框架基于Java,采用B/S架构,前端使用Vue+HTML+JavaScript+CSS+LayUI,后端使用SSM框架,数据库为MySQL。运行环境为Windows,JDK8+MySQL5.7+Tomcat8.5。提供演示视频及详细文档截图。
|
存储 Java 关系型数据库
ssm064农产品仓库管理系统系统(文档+源码)_kaic
农产品仓库管理系统基于现代经济快速发展和信息化技术的升级,采用SSM框架、Java语言及Mysql数据库开发。系统旨在帮助管理者高效处理大量数据信息,提升事务处理效率,实现数据管理的科学化与规范化。该系统涵盖物资基础数据管理、出入库订单管理等功能,界面简洁美观,符合用户操作习惯,并提供数据安全解决方案,确保信息的安全性和可靠性。通过自动化和集中处理,系统显著提高了仓库管理的效率和准确性。
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统