Nano Hash - криптовалюты, майнинг, программирование

Как получить всех пользователей, которые имеют определенную роль в Grails

Я хочу получить всех пользователей, у которых есть определенная роль, например «ROLE_USER».

Ниже приведены классы домена для пользователя, роли и роли пользователя.

User.groovy

class User {

    transient springSecurityService

    String username
    String password
        String email
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    static constraints = {
        username blank: false, unique: true
        password blank: false
    }

    static mapping = {
        password column: '`password`'
    }

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this).collect { it.role } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

Role.groovy

class Role {

    String authority

    static mapping = {
        cache true
    }

    static constraints = {
        authority blank: false, unique: true
    }
}

UserRole.groovy

class UserRole implements Serializable {

    User user
    Role role

    boolean equals(other) {
        if (!(other instanceof UserRole)) {
            return false
        }

        other.user?.id == user?.id &&
            other.role?.id == role?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (user) builder.append(user.id)
        if (role) builder.append(role.id)
        builder.toHashCode()
    }

    static UserRole get(long userId, long roleId) {
        find 'from UserRole where user.id=:userId and role.id=:roleId',
            [userId: userId, roleId: roleId]
    }

    static UserRole create(User user, Role role, boolean flush = false) {
        new UserRole(user: user, role: role).save(flush: flush, insert: true)
    }

    static boolean remove(User user, Role role, boolean flush = false) {
        UserRole instance = UserRole.findByUserAndRole(user, role)
        if (!instance) {
            return false
        }

        instance.delete(flush: flush)
        true
    }

    static void removeAll(User user) {
        executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
    }

    static void removeAll(Role role) {
        executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
    }

    static mapping = {
        id composite: ['role', 'user']
        version false
    }
}

Эти классы домена генерируются подключаемым модулем Spring Security.
Я добавил только поле электронной почты для класса пользователя.

Вот мой UserController.groovy

class UserController {

    def index = {
       }


    def list = {

        def role = Role.findByAuthority("ROLE_USER")
        println "role id "+role.id

        def users = User.findAll()         //Its giving me all Users regardless of Role
        println "total users "+users.size()
        for(user in users)
        {
            println "User "+user.username+" "+user.email
        }
        render (view: "listUsers", model:[users:users])

    }
}

В действии со списком я использовал User.findAll(), но это дает мне всех пользователей со всеми ролями.
Мне нужен список пользователей только из определенной роли..

ИЗМЕНИТЬ

Код для назначения ролей вновь созданному пользователю

def username = params.username
def emailID = params.emailID
def password = params.password

def testUser = new User(username: username, enabled: true, password: password,email:emailID)
testUser.save(flush: true)
def userRole = new Role(authority: 'ROLE_USER').save(flush: true)
UserRole.create testUser, userRole, true

Спасибо..

25.01.2013

Ответы:


1

Заменять

def users = User.findAll()

с участием

def users = UserRole.findAllByRole(role).user

и вы должны получить всех пользователей с требуемой ролью.

ИЗМЕНИТЬ

В вашем примере кода вы пытаетесь создать новую роль для пользователя. Поскольку роль с полномочиями ROLE_USER уже существует, а полномочия должны быть уникальными (см. часть «ограничения» в вашем классе ролей), эту новую роль нельзя сохранить в базе данных. Поскольку роль, которую вы назначаете в UserRole.create, не существует в базе данных, UserRole также не сохраняется. Вам нужно будет назначить существующую роль новому пользователю (например, с помощью `Role.findByAuthority').

Согласно Spring Source, создание ролей в Bootstrap.groovy — хорошая идея, потому что роли «обычно определяются на ранних этапах жизни приложения и соответствуют неизменяемым эталонным данным. Это делает BootStrap идеальным местом для их создания». (Блог Spring Source)

25.01.2013
  • Неа !! я до сих пор ничего не получаю 25.01.2013
  • Вы уверены, что роли правильно назначены пользователям? Каков результат для println UserRole.list().role.authority? 25.01.2013
  • Я получаю только эту [ROLE_ADMIN]... Проверьте мой код, который я обновил сейчас для назначения ролей новым пользователям 25.01.2013
  • Роль с полномочиями ROLE_USER уже существует, когда вы создаете тестового пользователя (Role.list().authority, чтобы увидеть существующие роли)? Тогда вам придется использовать существующую роль: UserRole.create testUser, Role.findByAuthority('ROLE_USER'), true 25.01.2013
  • Я новичок в Grails. Можете ли вы сказать мне, где мне нужно создать этот ROLE_USER, потому что я сделал это для ROLE_ADMIN, и это сработало, поэтому подумайте, что это способ создать ROLE_USER 25.01.2013
  • Role.list().authority() дай мне это [ROLE_ADMIN, ROLE_USER] 25.01.2013
  • Это работает... Я создал две роли как ROLE_ADMIN и ROLE_USER уже в Bootstrap.groovy.. с помощью Role.findByAuthority('ROLE_USER'), это сработало. Спасибо, но я хотел бы знать, это правильный способ создания ролей? 25.01.2013
  • Да, это то, что предлагает Spring Source (также см. Мое редактирование). Дальнейшее обсуждение недостатков этих жестко запрограммированных ролей и решение с использованием комбинации разрешений и ролей можно найти здесь: springinpractice.com/2010/10/27/ 25.01.2013
  • Разве это не def users = UserRole.findAllByRole(role)*.user (*)? 25.01.2013
  • Оператор распространения * необходим только для методов, а не для свойств. UserRole.findAllByRole(role).getUser() не будет работать из-за отсутствия оператора распространения. 25.01.2013
  • @saywow Они не совсем одинаковы, поэтому мой последний комментарий. someCollection.getUser() пытается выполнить getUser() коллекции, что в приведенном выше случае завершится ошибкой, в то время как someCollection.user собирает свойство user элементов коллекции, что эквивалентно использованию оператора распространения: someCollection*.getUser() 19.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..