Spring Security интеграция с открытым идентификатором в Grails - PullRequest
1 голос
/ 19 января 2012

Я работаю над интеграцией защиты пружины с openId для моего приложения Grails, используя ядро ​​springsecurity и плагины openid Springsecurity Я интегрировал его, и он работает хорошо, но мне нужно получить доступ к электронной почте для зарегистрированного пользователя. Как я могу получить это, все, что я могу получить, это токен, который используется для идентификации личности.

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Спасибо Иану Робертсу. Он дает мне этот ответ, который точно решает мою проблему. Его ответ был:

Как это случилось, я реализовал именно это в одном из моих приложений вчера :-) К сожалению, это не приложение с открытым исходным кодом, поэтому я не могу просто укажите на мой код, но я могу объяснить, что я сделал.

Плагин spring-security-openid поддерживает «обмен атрибутами» механизм OpenID, хотя поддержка не очень задокументирована (если на все). Насколько хорошо это работает, зависит от провайдера на дальнем конце, но это по крайней мере, работал на меня, используя Google и Yahoo.

Чтобы запросить адрес электронной почты у провайдера, необходимо добавить следующие к Config.groovy:

grails.plugins.springsecurity.openid.registration.requiredAttributes.email = "http://axschema.org/contact/email"

Теперь, чтобы подключить это к процессу регистрации пользователей, вам нужен адрес электронной почты поле в вашем классе домена пользователя S2, и вам нужно отредактировать сгенерированный OpenIdController.groovy в нескольких местах.

  • добавить свойство электронной почты в OpenIdRegisterCommand

  • в действии createAccount есть строка «if (! createNewAccount (...))», который передает имя пользователя, пароль и openid в качестве параметров. Измените это вместе с определением метода на передать весь командный объект вместо этих двух полей.

  • в createNewAccount передать значение электронной почты вперед от команды объект для конструктора объекта домена пользователя.

И, наконец, добавьте поле ввода для электронной почты на ваш Grails-приложение / просмотров / OpenId / createAccount.gsp.

Вы можете сделать то же самое с другими атрибутами, такими как полное имя.

grails.plugins.springsecurity.openid.registration.requiredAttributes.fullname = "http://axschema.org/namePerson"

Важно связать это воедино, чтобы вещь после последнего точка, следующая за requiredAttributes (полное имя в этом примере) должна совпадать имя свойства в OpenIdRegisterCommand.

С уважением Чару Джайн

1 голос
/ 19 января 2012

Я никогда не использовал подключаемый модуль springsecurity openid, но при использовании ядра springsecurity вы можете предоставить дополнительную информацию о текущем пользователе, добавив пользовательский UserDetails. В своем приложении я добавил эту реализацию, чтобы я мог показать свойство name вошедших в систему пользователей. Вам нужно будет немного изменить это, чтобы вместо этого указывался адрес электронной почты

/**
 * Custom implementation of UserDetails that exposes the user's name
 * http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/11%20Custom%20UserDetailsService.html
 */
class CustomUserDetails extends GrailsUser {

    // additional property
    final String name

    CustomUserDetails(String username,
                      String password,
                      boolean enabled,
                      boolean accountNonExpired,
                      boolean credentialsNonExpired,
                      boolean accountNonLocked,
                      Collection<GrantedAuthority> authorities,
                      long id,
                      String displayName) {

        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities, id)
        this.name = displayName
    }
}

Затем вам нужно создать собственную реализацию UserDetailsService, которая возвращает экземпляры класса выше

class UserDetailsService implements GrailsUserDetailsService {

    /**
     * Some Spring Security classes (e.g. RoleHierarchyVoter) expect at least one role, so
     * we give a user with no granted roles this one which gets past that restriction but
     * doesn't grant anything.
     */
    static final List NO_ROLES = [new GrantedAuthorityImpl(SpringSecurityUtils.NO_ROLE)]

    UserDetails loadUserByUsername(String username, boolean loadRoles) {
        return loadUserByUsername(username)
    }

    UserDetails loadUserByUsername(String username) {
        User.withTransaction { status ->

            User user = User.findByUsername(username)
            if (!user) {
                throw new UsernameNotFoundException('User not found', username)
            }

            def authorities = user.authorities.collect {new GrantedAuthorityImpl(it.authority)}
            return new CustomUserDetails(
                    user.username,
                    user.password,
                    user.enabled,
                    !user.accountExpired,
                    !user.passwordExpired,
                    !user.accountLocked,
                    authorities ?: NO_ROLES,
                    user.id,
                    user.name)
        }
    }
}

Вам необходимо зарегистрировать экземпляр этого класса как bean-компонент Spring с именем userDetailsService. Я сделал это, добавив следующее к Resources.groovy

userDetailsService(UserDetailsService)
...