Grails Spring Security UI - PullRequest
       1

Grails Spring Security UI

3 голосов
/ 31 октября 2011

Я новичок в Grails и пытаюсь создать простое приложение справочной службы.Я хочу иметь возможность зарегистрировать нового пользователя, войти в систему, опубликовать запрос / инцидент, сохранить его в базе данных, а со стороны администратора я хочу видеть все запросы / инциденты в таблице и изменять разрешения пользователей.Что касается безопасности (и управления безопасностью), я подумывал об использовании плагинов Spring security и Spring security UI.На данный момент я создал приложение, установил Spring Security и расширение его пользовательского интерфейса, добавил реальное имя, адрес электронной почты и свойства компании.Когда я запускаю приложение, мне удается успешно зарегистрироваться, и когда я подтверждаю регистрацию по электронной почте, я автоматически вхожу в систему, но при попытке войти в другой браузер я получаю следующую ошибку:

«Извините,мы не смогли найти пользователя с таким именем пользователя и паролем »

Но в базе данных он есть.

Кроме того, я хочу иметь, скажем, класс домена инцидента, где я буду сохранятьсявсе происшествия / запрос данных.Отношения между классами домена User и Incident будут один ко многим.Должен ли я реализовать это, как и любые другие отношения, или мне нужно сделать что-то особенное, потому что User реализован Spring Security?Я открыт для любых предложений.

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Существует несовместимость между последним ядром Spring-Security и UI 0.1.2.В частности, ядро ​​Spring-Security переместило кодирование пароля в обработчики событий beforeInsert / beforeUpdate в классе User.Контроллер RegisterController.register в spring-security-ui пока не знает об этом и пытается снова его кодировать, что приводит к двойному кодированию пароля.Чтобы исправить, переопределите RegisterController и измените действие register на:

def register = { RegisterCommand command ->

    if (command.hasErrors()) {
        render view: 'index', model: [command: command]
        return
    }

    def user = lookupUserClass().newInstance(email: command.email, username: command.username,
                                             password: command.password, accountLocked: true, enabled: true)
    if (!user.validate() || !user.save()) {
        // TODO
    }

    def registrationCode = new RegistrationCode(username: user.username).save()
    String url = generateLink('verifyRegistration', [t: registrationCode.token])

    def conf = SpringSecurityUtils.securityConfig
    def body = conf.ui.register.emailBody
    if (body.contains('$')) {
        body = evaluate(body, [user: user, url: url])
    }
    mailService.sendMail {
        to command.email
        from conf.ui.register.emailFrom
        subject conf.ui.register.emailSubject
        html body.toString()
    }

    render view: 'index', model: [emailSent: true]
}

Эта проблема отслеживается в http://jira.grails.org/browse/GPSPRINGSECURITYUI-27.

Что касается вашего второго вопроса, вы можете рассмотретьКласс пользователя, как и любой другой объект домена.

2 голосов
/ 31 октября 2011

Когда вы добавляете Spring Security в свой проект grails с помощью скрипта s2-quickstart, автоматически создаются классы домена для пользователя и роли. Это обычные доменные классы, поэтому вы можете добавить в класс пользователя все, что захотите (например, список инцидентов).

Чтобы получить текущий зарегистрированный объект домена пользователя во время выполнения, используйте

springSecurityService.currentUser

0 голосов
/ 25 апреля 2016

Эта проблема уже исправлена ​​в "org.grails.plugins: spring-security-ui: 1.0-RC3". По умолчанию spring-security-ui не кодирует пароль.

Вот описание и решение проблемы из документации по интерфейсу безопасности Grails Spring. Поиск в разделе «Хеширование паролей»

http://grails -plugins.github.io / Grails-весна-безопасности UI / v1 / гид / customization.html

"В последних версиях плагина Spring Security Core класс домена" Пользователь "является геном. Этот параметр по умолчанию устанавливается в ложное значение сценарием s2-quickstart с кодом для автоматического хеширования пароля. Это упрощает код (например, в контроллерах где вы создаете пользователей или обновляете пароли пользователей), но более старые сгенерированные классы не имеют этого сгенерированного кода. Это создает проблему для плагинов, подобных этому, поскольку невозможно надежно определить, хеширует ли класс домена пароль или вы используете более старый подход явного вызова springSecurityService.encodePassword ().

Прискорбным следствием смешивания нового класса домена, который выполняет хэширование паролей, с контроллерами, вызывающими springSecurityService.encodePassword (), является то, что пароли получают двойное хэширование, и пользователи не могут войти в систему. Поэтому, чтобы обойти это, есть параметр конфигурации, который вы можете указать контроллерам этого плагина, хэшировать или нет: grails.plugin.springsecurity.ui.encodePassword.

Эта опция по умолчанию имеет значение false , поэтому, если у вас более старый класс домена, который не обрабатывает хеширование, просто включите хеширование этого плагина:

grails.plugin.springsecurity.ui.encodePassword = true "

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