如何处理 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 插件中的自定义身份验证异常?

iOS - 如何处理自定义表格单元格中的方向变化

如何处理死锁

如何处理 URL(Spring、REST、CXF)中的转义字符(管道 |)?

如何处理 spring security + angular 中的 401 错误?