Security grails中具有开放id的Spring安全集成

Security grails中具有开放id的Spring安全集成,security,grails,spring-security,openid,google-openid,Security,Grails,Spring Security,Openid,Google Openid,我正在使用SpringSecurityCore和SpringSecurityOpenID插件为我的grails应用程序集成springsecurity和openId。我已经集成了它,它工作得很好,但我需要访问登录的人的电子邮件。我怎样才能得到它,我所能访问的只是一个用于识别此人的令牌。我从未使用过springsecurity openid插件,但在使用springsecurity core时,您可以通过实现自定义的UserDetails来公开有关当前用户的其他信息。在我的应用程序中,我添加了这个

我正在使用SpringSecurityCore和SpringSecurityOpenID插件为我的grails应用程序集成springsecurity和openId。我已经集成了它,它工作得很好,但我需要访问登录的人的电子邮件。我怎样才能得到它,我所能访问的只是一个用于识别此人的令牌。

我从未使用过springsecurity openid插件,但在使用springsecurity core时,您可以通过实现自定义的
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
的Springbean。为此,我将以下内容添加到
Resources.groovy

userDetailsService(UserDetailsService)
多亏了伊恩·罗伯茨。 他给了我这个答复,正好解决了我的问题。 他的回答是:

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

SpringSecurityOpenID插件支持“属性交换” OpenID的机制,尽管支持的文档不多(如果在 全部)。它的工作情况取决于远端的提供者,但这 至少用谷歌和雅虎为我工作过

要向提供商请求电子邮件地址,您需要添加 下面是Config.groovy的示例:

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

现在,要将其连接到用户注册过程中,您需要一封电子邮件 字段,您需要编辑生成的 OpenIdController.groovy在一些地方

  • 将电子邮件属性添加到openidregister命令

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

  • 在createNewAccount中,从命令向前传递电子邮件值 对象到用户域对象构造函数

最后,将电子邮件的输入字段添加到 grails应用程序/views/openId/createAccount.gsp

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

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

将其连接在一起的重要一点是,最后一个 下面的点requiredAttributes(本例中为fullname)必须匹配 OpenIdRegisterCommand上属性的名称

问候
Charu Jain

我已经证实了这一点,并提供了更多信息。上述步骤不仅可以获取电子邮件,而且在创建时还可以将其与新用户关联。如果您只想在身份验证过程中从会话中访问电子邮件(即:从OpenIdController CreateCount函数中),可以使用会话[OIAFH.LAST_OPENID_ATTRIBUTES]字符串对象来访问。
userDetailsService(UserDetailsService)