如何处理 Spring 安全中的动态角色变化?
Posted
技术标签:
【中文标题】如何处理 Spring 安全中的动态角色变化?【英文标题】:How to handle dynamic roles changing in Spring security? 【发布时间】:2014-03-22 22:38:50 【问题描述】:假设在一个应用程序中,我们有接口(UI)来分配角色。
第一种情况:
也就是说user A
是谁normal user
。一位管理员使用 UI 为他分配了ADMIN
角色。
现在,当user A
登录应用程序时,他可以看到 ADMIN 可以访问的所有选项卡。
第二种情况:
同时(当他登录并以 ADMIN 角色进行会话时),admin 将用户 A 设为具有正常权限的normal USER
。
但由于他以 ADMIN 身份登录,因此他可以访问所有选项卡的所有管理员信息,因为在此会话中他具有 ADMIN 角色。
我该如何解决这个问题??
【问题讨论】:
我不明白如何解决这个问题?但我同意你的看法 AFAIK 不支持 refreshing Spring 中的身份验证(安全上下文)。如果这与您有关,您可能需要自己实现它。 快速搜索类似问题:***.com/questions/9910252/…, ... 我们可以嵌入任何其他东西来解决这个问题。我在一个视频中听说我们可以嵌入一些技术来解决这个问题,但声音并不清晰。实现我的意味着总是调用数据库来检查用户是否有角色。 您提供的链接没有让我知道如何在不调用 repo 的情况下配置角色的动态更改。 【参考方案1】:第一种方法是即时使任何现有的用户会话过期。 以下帖子描述了两种替代方案Is it possible to invalidate a spring security session?
一种更复杂的方法是在他的权限发生变化时在列表中标记该用途。 这是一个很好的例子Implementation of singleton thread-safe list
此外,如果您添加一个自定义 spring 安全过滤器,该过滤器会检查用户是否在列表中,并在必要时重新验证用户。我会使用 switchuserfilter 作为参考实现。您无需切换用户,而是创建一个新的身份验证对象并更新 SecurityContextHolder。
所有必要的逻辑都应该包含在http://docs.spring.io/autorepo/docs/spring-security/3.0.x/apidocs/org/springframework/security/web/authentication/switchuser/SwitchUserFilter.html中
【讨论】:
以上是关于如何处理 Spring 安全中的动态角色变化?的主要内容,如果未能解决你的问题,请参考以下文章
当单个控制器收到许多请求时,Spring 如何处理线程安全?
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?