业务分析之--权限管理

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>
复制代码
原文地址:https://www.cnblogs.com/dw3306/p/9360372.html