【问题标题】:selecting content to display based on user in Grails with Spring Security使用 Spring Security 在 Grails 中根据用户选择要显示的内容
【发布时间】:2013-12-01 22:27:45
【问题描述】:

我有一个 Grails 应用程序,它的域为 People、Location、Pictures 和 Users。控制器和视图已生成。我有我的索引页sec:tagged,以便管理员可以看到控制器来上传文件、创建数据和用户。

用户拥有用户名、密码和位置。当用户登录时,我希望他们看到与其位置相关的文件。一个位置可以有多个用户。但我希望每个具有该位置的用户都能看到相关文件。我盯着@Secure,但转到sec: 标签。现在我只需要根据位置限制文件的显示。有什么建议吗?

这是我目前用于用户显示的代码

<sec:access expression="hasRole('ROLE_USER')">

<% def user = springSecurityService.getCurrentlyLoggedInUser()
def aPerson = user.person
def locations = Location.findAllByPerson(aPerson)
locations.each ${it.picture}    %>

<g:select name="picture" from="${aPerson.all()}"/>
</sec:access>

这不会在用户页面上显示任何内容。

【问题讨论】:

  • 听起来你可能需要看看使用springSecurityService来获取当前用户(getCurrentUser()),这样你就可以根据用户位置进行动态查询?
  • 您的域是什么样的?
  • 这是我目前所拥有的 // 我有这个在索引中
  • 请将代码添加到问题中。
  • 我认为你的问题是你试图在你的脚本块中打印 location.picture 。我不确定您是否可以使用 ${} 语法转义该块。我建议使用 g:each 标签来遍历脚本块之外的图片,例如。 ${img} 。希望对您有所帮助。

标签: grails spring-security


【解决方案1】:

首先,不惜一切代价避免&lt;% %&gt;。其次,我不知道你认为这段代码应该做什么:

<g:select name="picture" from="${aPerson.all()}"/>

最后,查看您的域代码以了解它们之间的实际关系会有所帮助。但是继续使用您提供的内容,我会这样处理:

控制器

def someAction() {
    def user = springSecurityService.getCurrentlyLoggedInUser()
    def aPerson = user.person
    def locations = Location.findAllByPerson(aPerson)
    [aPerson: aPerson, locations: locations]
}

查看

<!-- only use the expression tag if you actually need an expression -->
<sec:ifAllGranted roles='ROLE_USER'>
  <g:each in="${locations}" var="location">
     <!-- do something with each location -->
  </g:each>

  <g:select name="picture" from="${aPerson.all()}"/>
</sec:ifAllGranted>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多