如何在Grails中显示登录到选择框中的用户的角色

如何在Grails中显示登录到选择框中的用户的角色,grails,Grails,我有一个具有多个角色的用户,我想在标题的下拉列表中显示他的可用角色。一种方法是编写我自己的自定义标记,但是还有其他简单的方法吗。您可以使用标记,使用from=“${yourPrincipal.roles}并设置要显示的属性。更多信息请参见官方文档:您可以创建: class RolesTagLib{ 静态命名空间='my' def springSecurityService def currentUserRoleSelect={attrs-> def user=springSecurityServ

我有一个具有多个角色的用户,我想在标题的下拉列表中显示他的可用角色。一种方法是编写我自己的自定义标记,但是还有其他简单的方法吗。

您可以使用
标记,使用
from=“${yourPrincipal.roles}
并设置要显示的属性。更多信息请参见官方文档:

您可以创建:

class RolesTagLib{
静态命名空间='my'
def springSecurityService
def currentUserRoleSelect={attrs->
def user=springSecurityService.getCurrentUser()
def roles=UserRole.findallbyser(user).collect{it.role}作为集合
attrs.from=角色
attrs.optionKey=attrs.optionKey?:“id”
attrs.optionValue=attrs.optionValue?:“权限”

我是这样做的。在什么地方,有这种方法

def getRoleMap(userInstance) {
    List roles = Role.list()
    roles.sort { r1, r2 ->
      r1.authority <=> r2.authority
    }
    Set userRoleNames = []
    if (userInstance.id) {
      for (role in userInstance.authorities) {
        userRoleNames << role.authority
      }
    }
    LinkedHashMap<Role, Boolean> roleMap = [:]
    for (role in roles) {
      roleMap[(role)] = userRoleNames.contains(role.authority)
    }

    return roleMap

}

如何从中获取主体?您是否使用Spring Security来处理用户?我的问题是GSP,它在控制器中很容易,但我想在视图中显示角色列表。是的,我使用Spring Security,我想在选择框中显示,以便我可以在角色之间切换。您不应该在视图中获取主体。您最好使用passi将角色从控制器转移到视图。因此,如果您知道如何在控制器中获取角色,只需将其传递到模型中的
render
方法。然后,在视图中,将角色列表放在“from”标记属性中。是否使用Spring Security Core?
<my:currentUserRoleSelect name="role"/>
def getRoleMap(userInstance) {
    List roles = Role.list()
    roles.sort { r1, r2 ->
      r1.authority <=> r2.authority
    }
    Set userRoleNames = []
    if (userInstance.id) {
      for (role in userInstance.authorities) {
        userRoleNames << role.authority
      }
    }
    LinkedHashMap<Role, Boolean> roleMap = [:]
    for (role in roles) {
      roleMap[(role)] = userRoleNames.contains(role.authority)
    }

    return roleMap

}
<div class='role-map' style="width: 300px; height: 200px; overflow:auto;border: 1px solid black">
  <g:each in="${roleMap}">
    <div>
      <g:checkBox name="userRoles" value="${it.key.authority}" checked="${it.value}"/>
      ${it.key.authority.encodeAsHTML()}
    </div>
  </g:each>
</div>
UserRole.removeAll(user)
params.userRoles.roleAuthorities.each { roleAuthority ->
  UserRole.create(user, Role.findByAuthority(roleAuthority))
}