2013-11-02 4 views
0

Я пытаюсь настроить плагин Spring-security 2.0-RC2 для работы с моим приложением Grails. Я могу заставить его вставить моего администратора по умолчанию с хешированным паролем в mongodb. Я также настроил весеннюю безопасность для использования emailAddress вместо username в качестве поля имени пользователя для аутентификации.Ошибка аутентификации плагинов Grails Spring

Когда я пытаюсь войти (с правильными учетными данными), я получаю ошибку с ошибкой аутентификации. Я немного озадачен тем, что я делаю неправильно. Я, вероятно, пропустил что-то маленькое, из-за чего это не сработало. Моя конфигурация приведена ниже.

В Config.groovy У меня есть стандартная конфигурация и укажите usernamePropertyName, чтобы указать поле адреса электронной почты вместо имени пользователя.

grails.plugin.springsecurity.userLookup.userDomainClassName = 'model.Person' 
grails.plugin.springsecurity.userLookup.usernamePropertyName='email' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'model.PersonRole' 
grails.plugin.springsecurity.authority.className = 'model.Role' 
grails.plugin.springsecurity.securityConfigType = SecurityConfigType.InterceptUrlMap 

//Configure URL Restrictions 
grails.plugin.springsecurity.interceptUrlMap = [ 
    '/login/**':   [ 
    'IS_AUTHENTICATED_ANONYMOUSLY' 
    ], 
    '/static/**':  [ 
    'IS_AUTHENTICATED_ANONYMOUSLY' 
    ], 
    '/**':    [ 
    'IS_AUTHENTICATED_REMEMBERED'] 
] 

grails.plugin.springsecurity.password.algorithm = 'SHA-256' 

Я тогда Person.groovy файла, который был создан с помощью пружинной безопасности затем модифицированную изменить имя пользователя на адрес электронной почты. Сгенерированные PersonRole.groovy и Role.groovy не были изменены.

package model 

class Person { 
    transient springSecurityService 

    String id 
    String firstName 
    String lastName 
    String emailAddress 
    String password 

    boolean enabled = true 
    boolean accountExpired 
    boolean accountLocked 
    boolean passwordExpired 

    static transients = ['springSecurityService'] 

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

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

    Set<Role> getAuthorities() { 
    PersonRole.findAllByPerson(this).collect { it.role } as Set 
    } 

    def beforeInsert() { 
    encodePassword() 
    } 

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

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

В моей BootStrap.groovy я создаю пользователя по администратора по умолчанию, если один уже не существует:

def adminUser = Person.findByEmailAddress('[email protected]') ?: new Person(
    firstName: 'Admin', 
    lastName: 'User', 
    emailAddress: '[email protected]', 
    password: springSecurityService.encodePassword('admin'), 
    enabled: true).save(failOnError: true) 

Я также создал пользовательский auth.gsp файл следующим образом, но я также попытался использовать по умолчанию один с тем же результат.

<form action="${postUrl}" method="POST" autocomplete="off"> 
    <h4>Sign in</h4> 
    <g:if test="${flash.message}"> 
     <div class="alert alert-danger" style="padding: 10px">${flash.message}</div> 
    </g:if> 
    <p> 
    <input type="email" class="form-control" placeholder="Email address" name="j_username" autofocus /> 
    </p> 
    <p> 
    <input type="password" class="form-control" placeholder="Password" name="j_password" /> 
    </p> 
    <input type="submit" class="btn btn-lg btn-primary btn-block" value="${message(code: 'springSecurity.login.button')}" /> 
</form> 

Итак, кто-нибудь видит что-либо, что у меня отсутствует, что перестало бы проверять подлинность?

+1

Свойство '' emailAddress' не email', как у вас есть в вашей конфигурации –

+0

Ах хороший улов, я переработан и забыл изменить настройки там. Моя проблема была сочетанием этого и принятого ответа. Благодаря! – Michael

ответ

2

Вы вводите пароль с двойным кодированием. Это делается в классе Person в beforeInsert, и вы делаете это снова в коде BootStrap. Изменение

password: springSecurityService.encodePassword('admin'), 

в

password: 'admin', 
+0

Спасибо! Я знал, что должен делать что-то глупое, чего я не замечал. Я не обращал достаточно пристального внимания на то, что сгенерированный код сделал в отношении кода, который я нашел в качестве примера для класса BootStrap. – Michael

+0

Кроме того, как было указано в другом комментарии, я неправильно установил свойство usernamePropertyName. – Michael

Смежные вопросы