2

我正在使用springsecurity核心和springsecurity openid插件为我的grails应用程序集成spring security与openId。我已经集成了它,它运行良好,但我需要访问已登录人员的电子邮件。我怎么能得到它,我能访问的只是一个用于识别此人的令牌。

4

2 回答 2

4

感谢伊恩·罗伯茨。他给了我这个回复,正好解决了我的问题。 他的回答是:

碰巧我昨天在我的一个应用程序中实现了这一点 :-) 不幸的是,它不是一个开源应用程序,所以我不能只指出我的代码,但我可以解释我做了什么。

spring-security-openid 插件支持 OpenID 的“属性交换”机制,尽管支持的文档不多(如果有的话)。它的工作情况取决于远端的提供商,但这至少对我使用谷歌和雅虎有用。

为了向提供商请求电子邮件地址,您需要将以下内容添加到 Config.groovy:

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

现在要将其连接到您的用户注册过程中,您需要 S2 用户域类中的电子邮件字段,并且您需要在几个地方编辑生成的 OpenIdController.groovy。

  • 将电子邮件属性添加到 OpenIdRegisterCommand

  • 在 createAccount 操作中,有一行“if(!createNewAccount(...))”将用户名、密码和 openid 作为参数传递。将此与方法定义一起更改以传递整个命令对象,而不仅仅是这两个字段。

  • 在 createNewAccount 中,将电子邮件值从命令对象转发到用户域对象构造函数。

最后将电子邮件的输入字段添加到您的 grails-app/views/openId/createAccount.gsp。

您可以对其他属性(例如全名)执行相同操作。

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

将它连接在一起的重要一点是,requiredAttributes 后面的最后一个点之后的内容(本示例中为全名)必须与 OpenIdRegisterCommand 上的属性名称匹配。

问候查鲁耆那

于 2012-01-21T11:49:18.163 回答
1

我从未使用过 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)
        }
    }
}

您需要将此类的实例注册为名为userDetailsService. 我通过添加以下内容来做到这一点Resources.groovy

userDetailsService(UserDetailsService)
于 2012-01-19T15:12:55.297 回答