大型运输行业实战_day12_1_权限管理实现

1.业务分析

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

 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 = 1web

  

   2.3. 存放资源

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

        登陆完成后放入缓存代码:sql

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);express

     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存放方法与后面要用的获取用户资源方法session

 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实现权限断定

      权限断定管理类:mybatis

 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配置文件app

 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>

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

相关文章
相关标签/搜索