Grails Spring Security 插件 - 修改登录用户的权限

2024-06-25

我有一个简单的 Grails 应用程序,安装了 Spring Security Core 插件并且工作正常。但是,我还没有找到任何解决方案来解决在安全上下文中更新登录用户权限的问题。我不是在谈论更新当前用户的详细信息(即 springSecurityService.reauthenticate)。

我的问题是:我有一个简单的用户管理应用程序,其中使用了 ROLE_ADMIN 和 ROLE_USER 权限。现在,我有 2 位管理员从不同的计算机同时登录(具有 ROLE_ADMIN 权限),其中一位管理员决定将另一位管理员的权限从 ROLE_ADMIN 更改为 ROLE_USER。

如何更新用户和角色,以便修改后的用户(具有新的 ROLE_USER 角色)无法执行任何 ROLE_ADMIN 级别操作并立即重定向到 ROLE_USER 级别页面?有没有办法更新安全上下文,这样我就不必在所有控制器操作中进行额外的检查,以确定登录用户的权限是否已更改?我可以以某种方式使用 cahceUsers 属性吗?我没有修改cacheUsers,根据我的理解,默认情况下它是错误的。如果我错了,请纠正我。

编辑: 导致问题的顺序是

  1. 管理员“A”修改管理员“B”并为管理员“B”设置新角色(ROLE_USER)

  2. 代码调用PersonRole.removeAll(personInstanceB) and PersonRole.create(personInstanceB, roleAdmin)一切都正常更新

  3. 同时管理员“B”在修改权限时已经登录。管理员“B”可以继续在 ROLE_ADMIN 受限页面上工作,直到他/她注销并重新登录。只有这样权限才会更新并且管理员“B”具有新角色(ROLE_USER)

  4. 我希望管理员“B”在用户更新为新角色时重定向到 ROLE_USER 页面,而不仅仅是在注销/登录之后

  5. calling springSecurityService.reauthenticate personInstanceB.username)导致管理员“A”以管理员“B”的身份“登录”,因此这不起作用。

任何想法都会非常受欢迎。我可能在这里错过了一些简单的事情,但我不知道解决方案是什么。

干杯, 米佐托


这是未经测试的,但尝试一下

在您的控制器/服务类中,

...

User user = User.get(springSecurityService.principal.id) //get the user
Role adminRole = //get or create the admin Role
UserRole.remove user, role // remove admin Role

Role userRole = // get or create the user Role
UserRole.create user, role //add the user Role

... 

if (!user.hasErrors() && user.save(flush: true)) {
    springSecurityService.reauthenticate user.username // refresh the users security deatils
}

....

EDIT

现在清楚多了。

我最想做的就是使用切换用户功能。看切换用户 http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/single.html#15%20Switch%20User

  • 首先你设置useSwitchUserFilter归因于true
  • 建议您创建一个新角色(例如ROLE_SWITCH_USER)以获得此特权。
  • 在你的管理页面的某个地方,

    <sec:ifAllGranted roles='ROLE_SWITCH_USER'>
       <form action='/j_spring_security_switch_user' method='POST'>
          Switch to user: <input type='text' name='j_username'/> <br/>
          <input type='submit' value='Switch'/>
       </form>
    </sec:ifAllGranted>
    
  • 以您希望使用其用户名进行编辑的用户身份登录
  • 通过调用来更改他们的角色设置adminToUser()方法如下(举例)
  • 切换回原来的用户
  • Done.

-- 您可以使用第一个答案中的代码在控制器或服务中创建一个方法,该方法采用 userInstance 并将其角色从管理员更改为用户。

def adminToUser(user, adminRole, userRole){
    UserRole.remove user, adminRole
    UserRole.create user, userRole 
    if (!user.hasErrors() && user.save(flush: true)) {
        springSecurityService.reauthenticate user.username 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails Spring Security 插件 - 修改登录用户的权限 的相关文章

随机推荐

  • Heroku dyno/worker 在开始时崩溃

    我有一个用 Rails 编写的应用程序 部署在 Heroku 上 我以前一直在开发1个web dyno 但是今天我发布了应用程序 流量相当大 所以我决定增加到4个web dyno和1个worker dyno 我不知道为什么当我这样做时总是h
  • 如何使用javascript取消http请求

    我有一个页面 其中有一个事件处理程序附加到onclick事件 当事件触发时 它将文本框的内容传递给GET要求 自从url 不在同一个域中所以我创建一个脚本标签并将网址附加到其源 如下所示 elem onclick fire function
  • Express生成JSON

    我正在尝试传递一个键值并根据传递的键生成 JSON 响应 快速计划 var express require express async require async http require http mysql require mysql
  • 使用 mutate、cross、case_when 将多个变量设置为 NA 的类型冲突

    我想结合使用mutate across and case when将某些情况设置为NA 缺失 跨多个变量 假设我有一个指示变量 vs 标记案例 应该是NA对于变量 carb 和 gear 我想使用类似的方法将这些情况同时设置为缺少这两个变量
  • 如何在 Fortran 中实现数组结构而不是结构数组?

    我正在使用 Fortran 编写有关 CFD 主题的代码 在与一些计算机科学领域的朋友讨论后 他们告诉我 如果在他 她的代码中实现数组结构 SoA 而不是结构数组 AoS 可以加快计算时间 我见过很多关于这个主题的实现的例子 但大多数都是用
  • 如何在 TypeScript 中将字符串转换为枚举?

    我在 TypeScript 中定义了以下枚举 enum Color Red Green 现在 在我的函数中 我收到字符串形式的颜色 我尝试过以下代码 var green Green var color Color
  • 在 python 中编写轮询函数的更好方法

    我写了一个轮询函数来检查reg result可变 120 秒 reg result 0 while timeout time time 120 while reg result is not REGISTERED and time time
  • ESLint 扩展与插件 v2020

    有回复了question https stackoverflow com questions 53189200 whats the difference between plugins and extends in eslint在我看来 这
  • 如何在 Perl 中不阻塞地测试 STDIN?

    我正在编写我的第一个 Perl 应用程序 一个 AOL Instant Messenger 机器人 它与 Arduino 微控制器对话 后者控制一个伺服系统 按下我们系统管理员服务器上的电源按钮 该服务器每 28 小时左右就会随机冻结一次
  • 关注点分离:什么时候最好将语义与语法分离?

    Choices 类型类的出色之处在于它们允许我们将额外的结构连接到现有类型 从而使我们能够推迟一些设计决策 而不是在构思时匆忙做出决定 另一方面 例如 在面向对象编程中 我们被迫考虑类型需要立即执行什么操作 以及稍后出现的或需要的任何附加结
  • Excel 中数字的条件格式(自定义格式)具有多个条件

    我想根据单元格中的值动态地将数字格式化为 M 百万 B 十亿 或 K 千 我尝试过 但这不起作用 gt 1000000000 0 B gt 1000000 0 M gt 1000 0 K 0 如果我给出任意两个条件 它就会起作用 例如 gt
  • 如何持续交付基于SQL的应用程序?

    我希望将持续交付概念应用到我们正在构建的 Web 应用程序中 并想知道是否有任何解决方案可以保护数据库免受意外错误提交的影响 例如 删除整个表而不是单个记录的错误 根据持续交付原则 如何限制这个问题的影响 即应用程序逐渐部署在基础设施的各个
  • “‘测试’模块错误导入”是什么意思?

    我已经逐行复制了一个工作测试 只是更改了一些名称 至少我是这么认为的 现在我得到了这个非常神秘的错误 我用 FOO BAR 替换了一些东西 ImportError tests module incorrectly imported from
  • 来自 NSString 的 iOS SecKeyRef

    我需要使用公钥将用户密码加密为 Base64 字符串 公钥是一个 NSString 像这样的东西 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgWO7p1AvCaHUeaM6rSczBBAqt mKObHx
  • PhpStorm 无法识别 PHP 类

    今天早上我遇到了这个问题 我不知道如何解决这个问题 这是一个image https i stack imgur com Ampmj png和一个视频 http screencast com t 2ubAbwPj6 http screenca
  • 多个 AWS API Gateway API 作为同一 Lambda 函数的触发器

    我已经有一个 API Gateway API 作为我的 AWS Lambda 函数的触发器 然而 当我尝试将另一个 API 作为触发器添加到同一个 AWS Lambda 时 它抛出了一个错误 创建触发器时出错 此方法上已存在集成 即使我从
  • 挂钩到文件,实时读取新内容

    我如何连接到另一个程序当前正在使用的文件 该程序不断向该文件写入内容 假设有一个 10 行的文本文件 当我启动我的应用程序时 每次写入程序保存其内容时 它都必须检测并读取其中的任何内容 可以在不不断检查文件大小 日期的情况下完成此操作吗 您
  • c Sharp exe 在打开时应要求“以管理员身份运行”提示

    我有一个由 c Sharp 程序生成的 exe 当我运行 exe 时 我希望出现 UAC 提示 并提供以管理员身份运行 exe 的选项 我见过默认以管理员身份运行 exe 的示例 但是 如何让 UAC 要求我以管理员身份运行 exe 任何想
  • 如何在 Java 中将公历转换为 Unix 时间?

    我需要一种将 GregorianCalendar 对象转换为 Unix 时间 即 long 的方法 还需要一种将 Unix 时间 长 转换回 GregorianCalendar 对象的方法 有没有什么方法可以做到这一点 如果没有 那我该怎么
  • Grails Spring Security 插件 - 修改登录用户的权限

    我有一个简单的 Grails 应用程序 安装了 Spring Security Core 插件并且工作正常 但是 我还没有找到任何解决方案来解决在安全上下文中更新登录用户权限的问题 我不是在谈论更新当前用户的详细信息 即 springSec