• 大型运输行业实战_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>

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

  • 相关阅读:
    [Android]SharedPreferences
    [Android]XML界面布局常用属性概括
    [Android]XML解析技术
    [Android]Layout标签之-viewStub,requestFocus,merge,include
    [Android]JSON
    [Android]SQLite基本控制台命令简介
    [Android]流文件
    [HTML5]WebSQLDatabase-关系型数据库简介
    [Android]ADB和NavicatLiteSQLDBmanager的数据管理
    [Android]SqliteOpenHelper抽象类实现SQL_DB的管理
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8258918.html
Copyright © 2020-2023  润新知