如何实现:
将url 独立成一个个权限,存放于数据库中,一个url 就是一个权限,用户可以有多个权限,存放于一个集合中,再缓存与Redis中,利用cookie或Session作为标识获取Redis中的权限集合,拦截器获取当前访问的Url 再与权限集合中的url逐个比较,若相等则放行,不等则拦截。
表结构大致如下:
具体实现:
登录成功后调用 redisTemplate.opsForList().rightPushAll(key,v)它专门用于缓存list型数据
再用 redisTemplate.opsForList().range(key, 0, -1); 获取。获取第0条开始 -1条结束,
其实就是获取所有。
- 后台登录成功后 向缓存丢数据。顺带设置标识用Cookie
String uuid2 = UUID.randomUUID().toString();
redisTemplate.opsForList().rightPushAll("mengpeng:Jurisdiction:" + mengpengUser.getUserName() + uuid2, listJurisdiction);
// Session cookie
request.getSession().setAttribute(mengpengUser.getUserName(), mengpengUser);
Cookie cookie = new Cookie("HaylionLogin", mengpengUser.getUserName() + uuid2);
cookie.setPath("/");
- redis包用的是这个。
import org.springframework.data.redis.core.StringRedisTemplate;
拦截器设置:
String cookie = CookieUtil.getCookie(request, "HaylionLogin"); //自己写的工具类。获取指定名字的Cookie的值。
String url = request.getRequestURI();
List listuserJurisdiction = redisTemplate.opsForList().range("mengpeng:Jurisdiction:" + cookie, 0, -1);
for (int i = 0; i < listuserJurisdiction.size(); i++) {
// 管理员直接放行。
if (listuserJurisdiction.get(i).toString().equals("/admin")) {
return true;
}
// 是否拥有权限。
if (listuserJurisdiction.get(i).toString().equals(url)) {
return true;
}
}