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