zoukankan      html  css  js  c++  java
  • 大型运输行业实战_day12_1_权限管理实现

    1.业务分析

        权限说的是不同的用户对同一个系统有不同访问权限,其设计的本质是:给先给用户分配好URL,然后在访问的时候判断该用户是否有当前访问的URL.

     2.实现

          2.1数据库设计标准5表权限结构

         

         2.2.sql语句实现,根据用户id查询该用户所有的资源

           

            sql语句:   SELECT ur.user_id, r.url FROM user_role ur LEFT JOIN role_resource rr ON (ur.role_id = rr.role_id) LEFT JOIN resource r ON (rr.resource_id = r.id) WHERE ur.user_id = 1

      

       2.3. 存放资源

            在用户登录完成后,根据该用的id,查询出所用资源,并放入缓存中.

            登录完成后放入缓存代码:

    1                   //密码正确 登录成功
    2                      //存放资源信息
    3                           //放memcache  key= 业务前缀_userId   value  list
    4                  String key="resource_"+loginUserByName.getId();//准备key
    5                  //调用 到查询 到
    6                  List<String> resource = resourceDao.getResource(loginUserByName.getId()); //根据用户id获取该用户的所用资源
    7                  DicMemcache.putResource(key,resource); //存放到memcache缓存中

         用到的resourceDao代码:

          接口: List<String> getResource(Integer id);

         mapper映射文件

     1 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     2         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <!--
     4 对应的接口地址: namespace="com.day02.sation.dao.ITicketDao"
     5 -->
     6 <mapper namespace="com.day02.sation.dao.IResourceDao">
     7 
     8     <select id="getResource" parameterType="int" resultType="String">
     9 SELECT  r.url FROM user_role ur LEFT JOIN role_resource rr ON (ur.role_id = rr.role_id)
    10 LEFT JOIN resource r ON (rr.resource_id = r.id) WHERE ur.user_id = #{id}
    11    </select>
    12 </mapper>

       用到的DicMemcache存放方法与后面要用的获取用户资源方法

     1  /**
     2      * 存放用户资源
     3      * @param key
     4      * @param value
     5      */
     6     public static void putResource(String key,Object value) {
     7         memcachedAccess.put(key,value);
     8     }
     9 
    10     /**
    11      * 获取用户资源
    12      * @param key
    13      */
    14     public static List<String> getResource(String key) {
    15         List<String> obj =(List<String>) memcachedAccess.getObj(key);
    16         return obj;
    17 
    18     }

    2.4使用aop实现权限判定

          权限判定管理类:

     1 package com.day02.sation.aop;
     2 
     3 import com.day02.sation.map.DicMemcache;
     4 import com.day02.sation.model.LoginUser;
     5 import org.slf4j.Logger;
     6 import org.slf4j.LoggerFactory;
     7 import org.springframework.web.context.request.RequestContextHolder;
     8 import org.springframework.web.context.request.ServletRequestAttributes;
     9 
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 import javax.servlet.http.HttpSession;
    13 import java.io.IOException;
    14 import java.util.List;
    15 
    16 /**
    17  * Created by Administrator on 1/9.
    18  */
    19 public class resourceAop {
    20     private static final Logger logger = LoggerFactory.getLogger(resourceAop.class);
    21 
    22     /**
    23      * 方法执行前输出
    24      */
    25     public void beforeResource() throws IOException {
    26         logger.info("-----------beforeResource----------------");
    27         ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    28         //获取请求对象
    29         HttpServletRequest request = requestAttributes.getRequest();
    30         //获取响应对象
    31         HttpServletResponse response = requestAttributes.getResponse();
    32         //查看是否已经登录   做权限必须是在登录的情况下
    33         HttpSession session = request.getSession();
    34         LoginUser loginUser = (LoginUser) session.getAttribute("LOGIN_IN_SESSION");
    35         if (loginUser != null) {//说明已经登录
    36             //权限判定
    37             //1.获取 当前访问的资源
    38             String requestURI = request.getRequestURI();
    39             System.out.println("requestURI=" + requestURI);
    40             //2.获取用户拥有的资源   缓存中取
    41             String key = "resource_" + loginUser.getId();//拼接权限资源key
    42             List<String> resource = DicMemcache.getResource(key);//根据key获取对应的资源列表
    43             //3.比较是否有该资源
    44             boolean isResource = false;//给定默认的值为没有改权限
    45             for (int i = 0; i < resource.size(); i++) {
    46                 String valueResource = resource.get(i);
    47                 if (requestURI.equals(valueResource)) {
    48                     //拥有在资源的权限
    49                     isResource = true;
    50                     logger.info("有该权限:=" + valueResource);
    51                     break;
    52                 }
    53             }
    54             //没有该资源权限
    55             if (!isResource) {
    56                 response.sendRedirect("/noResource.jsp");
    57             }
    58         } else {
    59             //用户没用登录不做权限判定
    60         }
    61     }
    62 }

        aop配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop
     6          http://www.springframework.org/schema/aop/spring-aop.xsd">
     7     <!--引入日志管理类-->
     8     <bean id="webAspectLog" class="com.day02.sation.aop.WebAspectLog"/>
     9     <!--引入权限管理类-->
    10     <bean id="resourceAop" class="com.day02.sation.aop.resourceAop"/>
    11     <!--配置切面-->
    12     <aop:config>
    13         <!--日志aop-->
    14         <aop:aspect ref="webAspectLog">
    15             <aop:pointcut id="pointcut" expression="execution(* com.day02.sation.controller.*Controller.*(..))"/>
    16             <aop:before method="beforeLog" pointcut-ref="pointcut"/>
    17            <!-- 注意如果要获取执行后的结果 必须配置参数 returning="对象为afterLog方法的参数对象名称"-->
    18             <aop:after-returning method="afterLog" pointcut-ref="pointcut" returning="returnObj"/>
    19         </aop:aspect>
    20         <!--权限aop-->
    21         <aop:aspect ref="resourceAop">
    22             <aop:pointcut id="pointcut" expression="execution(* com.day02.sation.controller.*Controller.*(..))"/>
    23             <aop:before method="beforeResource" pointcut-ref="pointcut"/>
    24         </aop:aspect>
    25     </aop:config>
    26 </beans>

     重启项目权限管理搞定,权限的资源配置角色分配等工作请在站务管理系统中完成!

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8258918.html
Copyright © 2011-2022 走看看