我正在使用springsecurity核心和springsecurity openid插件为我的grails应用程序集成spring security和openId。我已经集成了它,它运行良好,但我需要访问登录的人的电子邮件。我怎样才能得到它,我能够访问的所有内容都是用于识别此人的令牌。
答案 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作为参数。将此更改与方法定义一起更改为 传递整个命令对象而不是这两个字段。
从命令向前传递电子邮件值 对象到用户域对象构造函数。
最后为您的电子邮件添加电子邮件输入字段 的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)