Security Grails Spring安全插件-修改登录用户';政府当局

Security Grails Spring安全插件-修改登录用户';政府当局,security,spring,plugins,grails,Security,Spring,Plugins,Grails,我有一个简单的Grails应用程序,安装了SpringSecurity核心插件,运行良好。但是,我还没有找到在安全上下文中更新登录用户权限的任何解决方案。我不是说更新当前用户的详细信息(即springSecurityService.reaauthenticate) 我的问题是:我有一个简单的用户管理应用程序,其中使用了ROLE_ADMIN和ROLE_用户权限。现在,我有两个管理员从不同的计算机同时登录(具有ROLE_ADMIN权限),其中一个管理员决定将另一个管理员的权限从ROLE_ADMIN更

我有一个简单的Grails应用程序,安装了SpringSecurity核心插件,运行良好。但是,我还没有找到在安全上下文中更新登录用户权限的任何解决方案。我不是说更新当前用户的详细信息(即springSecurityService.reaauthenticate)

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

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

编辑: 导致问题的顺序是

  • 管理员“A”修改管理员“B”,并为管理员“B”设置新角色(角色\用户)

  • 代码调用
    PersonRole.removeAll(personInstanceB)和
    PersonRole.create(personInstanceB,roleAdmin)
    所有内容都会正常更新

  • 同时,管理员“B”在其权限被修改时已登录。管理员“B”可以继续处理角色\管理员限制页面,直到他/她注销并重新登录。只有在更新权限后,管理员“B”才具有新角色(角色\用户)

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

  • 调用
    springSecurityService.reaauthenticate personInstanceB.username)
    会导致管理员“A”以管理员“B”的身份“登录”,因此这不起作用

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

    干杯,
    Mizztto

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

    在控制器/服务类中

    ...
    
    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
    }
    
    ....
    
    编辑 这一点现在清楚多了

    我要做的就是使用switch user函数。看

    • 首先,将
      useSwitchUserFilter
      属性设置为
      true
    • 建议您为此权限设置一个新角色(例如
      role\u SWITCH\u 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>
      

      我已通过两次重新验证解决了此问题:

      保存正在降级其他用户的管理员的名称:

      def originalUserName = springSecurityService.principal.name
      springSecurityService.reauthenticate user.username
      springSecurityService.reauthenticate originalUserName
      

      嗨,谢谢你的回复。在发布我的问题之前,我已经按照你描述的那样做了。但是,这意味着,如果您是管理员,并且更新了另一个管理员的权限->则调用springSecurityService.reauthenticate user.username将导致使用修改后的用户凭据更新会话。这意味着您刚刚以您所修改的用户身份“登录”。我不想:)我会编辑我的帖子,让它更清楚我想要的是什么。非常感谢,现在似乎工作得很好,很简单,但非常强大!:)尽管如此,在用户登录时,应该有更简单的方法通知修改后的用户他们的权限已更改。我需要追根究底:)@mizzto没问题!可能有一个更简单的方法来实现这一点。。。如果你发现了什么,一定要把它贴上去!理想的解决方案不是:
      SpringSecurityUtils.doWithAuth(otherUsername){springSecurityService.reaauthenticate(otherUsername)}
      ?但似乎无法让它工作。。。
      def originalUserName = springSecurityService.principal.name
      springSecurityService.reauthenticate user.username
      springSecurityService.reauthenticate originalUserName