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

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

转载于:https://www.cnblogs.com/newAndHui/p/8258918.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 安装maven

2019独角兽企业重金招聘Python工程师标准>>> 目录:/usr/local/maven 1.下载 wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz 2.解压 tar -zxvf apache-maven-3.5.3-bin.tar.gz 3.配置 vi /etc/profile #讲下面…

如何在React Native中使用react-navigation 5处理导航

React-navigation is the navigation library that comes to my mind when we talk about navigation in React Native. 当我们谈论React Native中的导航时&#xff0c;React-navigation是我想到的导航库。 Im a big fan of this library and its always the first solution I…

8597 石子划分问题 dpdp,只考虑第一次即可

8597 石子划分问题 时间限制:500MS 内存限制:1000K提交次数:155 通过次数:53 题型: 编程题 语言: G;GCC;VC Description 给定n个石子&#xff0c;其重量分别为a1,a2,a3,...,an。 要求将其划分为m份&#xff0c;每一份的划分费用定义为这份石子中最大重量与最小重量差的平方。…

802. 找到最终的安全状态

在有向图中&#xff0c;以某个节点为起始节点&#xff0c;从该点出发&#xff0c;每一步沿着图中的一条有向边行走。如果到达的节点是终点&#xff08;即它没有连出的有向边&#xff09;&#xff0c;则停止。 对于一个起始节点&#xff0c;如果从该节点出发&#xff0c;无论每…

第01章—快速构建

spring boot 系列学习记录&#xff1a;http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址&#xff1a;https://gitee.com/jinxiaohang/springboot 一、Spring Initializr 使用教程 &#xff08;IntelliJ IDEA&#xff09; 具体步骤&#xff1a; 1、打开IDEA &am…

鱼眼镜头的distortion校正【matlab】

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 作者&#xff1a;WWC %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 功能&#xff1a;畸变矫正 clc; clear; close all; %% 读取图像 Aimread(D:\文件及下载相关\图片\distortion2.jpg)…

C# 使用WinApi操作剪切板Clipboard

前言&#xff1a; 最近正好写一个程序&#xff0c;需要操作剪切板 功能很简单&#xff0c;只需要从剪切板内读取字符串&#xff0c;然后清空剪切板&#xff0c;然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作&#xff0c;原因无他&#xff0c;因为.Net框架…

专访赵加雨:WebRTC在网易云信的落地

去年的这个时候&#xff0c;在市面上公开表示使用WebRTC的公司还没几家&#xff0c;但2018年以来&#xff0c;宣布采用或支持WebRTC的公司已经越来越多。实时音视频提供商网易云信也在自研的NRTC中集成了WebRTC。在他们眼里&#xff0c;2017年是WebRTC的转折之年&#xff0c;而…

1、Linux命令随笔

1 Linux命令总结2 3 man 命令帮助;4 help 命令的帮助&#xff08;bash的内置命令&#xff09;;5 ls list,查看目录列表;6 -ld&#xff1a;查看目录权限;7 -l:(long)长格式显示属性;8 -F:给不同的文件类型结尾加标识9 -p:给目录加斜线10 …

1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;4 解释&#xff1a; T_3 0 1 1 2 T_4 1…

5827. 检查操作是否合法

给你一个下标从 0 开始的 8 x 8 网格 board &#xff0c;其中 board[r][c] 表示游戏棋盘上的格子 (r, c) 。棋盘上空格用 ‘.’ 表示&#xff0c;白色格子用 ‘W’ 表示&#xff0c;黑色格子用 ‘B’ 表示。 游戏中每次操作步骤为&#xff1a;选择一个空格子&#xff0c;将它变…

5193. 删除字符使字符串变好

5193. 删除字符使字符串变好 一个字符串如果没有 三个连续 相同字符&#xff0c;那么它就是一个 好字符串 。 给你一个字符串 s &#xff0c;请你从 s 删除 最少 的字符&#xff0c;使它变成一个 好字符串 。 请你返回删除后的字符串。题目数据保证答案总是 唯一的 。 示例 …

PHP--------微信网页开发实现微信扫码功能

今天说说微商城项目中用到的扫一扫这个功能&#xff0c;分享一下&#xff0c;希望对各位有所帮助。 前提&#xff1a;要有公众号&#xff0c;和通过微信认证&#xff0c;绑定域名&#xff0c;得到相应信息&#xff0c;appid&#xff0c;appsecret等。 微信开发文档&#xff1a;…

313. 超级丑数

超级丑数 是一个正整数&#xff0c;并满足其所有质因数都出现在质数数组 primes 中。 给你一个整数 n 和一个整数数组 primes &#xff0c;返回第 n 个 超级丑数 。 题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。 示例 1&#xff1a; 输入&#xff1a;n 12,…

[SQL] 请教一下 count里面有case when 一般情况下啥时候用

http://www.itpub.net/forum.php?modviewthread&tid1810967 问题: 比如 count(case when pday_id${deal_date} then 1 end) 我有点想不明白具体什么情况下count&#xff08;&#xff09; 这个小括号里面还要用case when 大家做BI统计的时候一般什么情况用啊 还有个…

路由器架设虚拟服务器让外网访问到本地网站

确定电脑与路由器正确连接&#xff0c;并且已连至互联网。在地址栏中输入192.168.0.1回车&#xff0c;输入用户名密码&#xff0c;进入路由器主界面。 然后点击左侧菜单中的“虚拟服务器”&#xff0c;——“端口段映射”打开“端口段映射”界面。 由于网站用的是80端口&#x…

selenium模块

selenium模块 阅读目录 一 介绍二 安装三 基本使用四 选择器五 等待元素被加载六 元素交互操作七 其他八 项目练习一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器&#xff0c;完…

关于tomcat Post 数据参数的问题

2019独角兽企业重金招聘Python工程师标准>>> POST请求本身并未限制传入参数大小&#xff0c;是tomcat 容器设置了接收参数大小的限制。修改server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"2000" red…

杜教筛--51nod1239 欧拉函数之和

求$\sum_{i1}^{n}\varphi (i)$&#xff0c;$n\leqslant 1e10$。 这里先把杜教筛的一般套路贴一下&#xff1a; 要求$S(n)\sum_{i1}^{n}f(i)$&#xff0c;而现在有一数论函数$g(i)$&#xff0c;$g(i)$的前缀和很无脑&#xff0c;且$f$和$g$的狄利克雷卷积的前缀和很无脑&#xf…

修改npm全局安装模式的路径

修改npm全局安装模式的路径 在正式写此文章之前&#xff0c;我得说一点血泪史。 刚学nodeJS不久&#xff0c;很纳闷为什么全局安装的模块在 node安装目录/node_modules‘ 中没找到&#xff01;后来仔细看了下安装成功后的信息&#xff0c;才发现原来是自动安装在C盘了&#xff…