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>
