Security grails中具有开放id的Spring安全集成
我正在使用SpringSecurityCore和SpringSecurityOpenID插件为我的grails应用程序集成springsecurity和openId。我已经集成了它,它工作得很好,但我需要访问登录的人的电子邮件。我怎样才能得到它,我所能访问的只是一个用于识别此人的令牌。我从未使用过springsecurity openid插件,但在使用springsecurity core时,您可以通过实现自定义的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来公开有关当前用户的其他信息。在我的应用程序中,我添加了这个
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中,从命令向前传递电子邮件值 对象到用户域对象构造函数
Charu Jain我已经证实了这一点,并提供了更多信息。上述步骤不仅可以获取电子邮件,而且在创建时还可以将其与新用户关联。如果您只想在身份验证过程中从会话中访问电子邮件(即:从OpenIdController CreateCount函数中),可以使用会话[OIAFH.LAST_OPENID_ATTRIBUTES]字符串对象来访问。
userDetailsService(UserDetailsService)