Как отобразить роли пользователя, вошедшего в окно выбора, в Grails - PullRequest
1 голос
/ 22 июля 2011

У меня есть пользователь с несколькими ролями, я хочу отобразить его доступные роли в выпадающем списке в шапке.Один из способов - написать свой собственный тег, но есть ли другой простой способ сделать это.

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Вы можете создать библиотеку пользовательских тегов :

class RolesTagLib {
    static namespace = 'my'

    def springSecurityService

    def currentUserRoleSelect = { attrs ->
        def user = springSecurityService.getCurrentUser()
        def roles = UserRole.findAllByUser(user).collect { it.role } as Set
        attrs.from = roles
        attrs.optionKey = attrs.optionKey ?: 'id'
        attrs.optionValue = attrs.optionValue ?: 'authority'
        out << g.select(attrs)
    }
}

А затем в своем GSP:

<my:currentUserRoleSelect name="role"/>
0 голосов
/ 22 июля 2011

Вот как я это делаю.Где-нибудь, сделайте этот метод доступным.

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

}

Затем вызовите этот метод и перенаправьте его в представление как [roleMap: 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))
}
0 голосов
/ 22 июля 2011

Вы можете использовать тег <g:select>, используя from="${yourPrincipal.roles} и задавая свойство для отображения. Больше в официальных документах: http://grails.org/doc/latest/ref/Tags/select.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...