Spring中的open安全集成与grails中的open id

时间:2012-01-19 12:39:51

标签: security grails spring-security openid google-openid

我正在使用springsecurity核心和springsecurity openid插件为我的grails应用程序集成spring security和openId。我已经集成了它,它运行良好,但我需要访问登录的人的电子邮件。我怎样才能得到它,我能够访问的所有内容都是用于识别此人的令牌。

2 个答案:

答案 0 :(得分:3)

感谢Ian Roberts。 他给了我这个答复,这完全解决了我的问题。 他的回答是:

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

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 /视图/ OPENID / createAccount.gsp。

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

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

将它连接在一起的重要一点是最后的事情 dot following requiredAttributes(本例中为fullname)必须匹配 OpenIdRegisterCommand上的属性名称。

此致 Charu Jain

答案 1 :(得分: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的Spring bean。我通过将以下内容添加到Resources.groovy

来完成此操作
userDetailsService(UserDetailsService)