zoukankan      html  css  js  c++  java
  • 利用ServletContext,实现Session动态权限变更

    1、前言

    很多Spring Boot应用使用了Session作为缓存,一般会在用户登录后保存用户的关键信息,如:

    • 用户ID。

    • 用户名。

    • 用户token。

    • 权限角色集合。

    • 等等。。。

      在管理员修改了用户的权限后,希望能立即生效。此时,会发现一个问题,管理员的HTTP请求对象,只能获取自己的Session对象,而无法获取用户的Session对象。这样对已登录的用户、或Session未过期的用户似乎没有办法实现动态权限变更。

      当然,并不是真的没有办法,通常的做法,可使用Spring Security插件框架来实现动态权限变更。

      这里,提供了另一种思路,即利用ServletContext对象的共享特性,来实现用户权限变更的信息传递。

    2、总体思路

    建立一个用户变更字典globalChangeMap(Map<Integer,Integer>类型)作为userId与changeFlag的映射关系,其中changeFlag暂时没有意义。如果需要通知信息类型超过1种,不足32种,可将changeFlag按位编码,每位表示一种变更类型。还是先假设只有权限变更这一种类型。

    对globalChangeMap作为核心进行封装,作为变更服务类ChangeService,提供必要的接口方法。

    将ChangeService加入ServletContext对象中,实现全局共享。

    如果管理员修改了某个用户的权限后,则在globalChangeMap中加入一条变更数据。

    而AuthorizationAspect切面类,该切面类负责token认证、权限认证。现在先检查globalChangeMap有无变更记录,如果有,表示要查询并更新用户权限,并将新的权限角色集合更新到Session中,最后移除globalChangeMap中该用户的变更数据。对于本次拦截的请求,则可根据新的权限配置进行处理。

    作者:阿拉伯1999
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    养成良好习惯,好文章随手顶一下。
  • 相关阅读:
    Learning Spark中文版--第三章--RDD编程(1)
    关于learning Spark中文版翻译
    dom4j 常用操作
    Invalid bound statement (not found)
    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
    docker 运行tomcat 并部署 java web项目
    docker build no such file or directory
    Docker 笔记
    java 自动拆箱 自动装箱
    Ubuntu18 中文乱码 问题 解决
  • 原文地址:https://www.cnblogs.com/alabo1999/p/14939327.html
Copyright © 2011-2022 走看看