我正在使用springsecurity核心和springsecurity openid插件为我的grails应用程序集成spring security与openId。我已经集成了它,它运行良好,但我需要访问已登录人员的电子邮件。我怎么能得到它,我能访问的只是一个用于识别此人的令牌。
2 回答
感谢伊恩·罗伯茨。他给了我这个回复,正好解决了我的问题。 他的回答是:
碰巧我昨天在我的一个应用程序中实现了这一点 :-) 不幸的是,它不是一个开源应用程序,所以我不能只指出我的代码,但我可以解释我做了什么。
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 上的属性名称匹配。
问候查鲁耆那
我从未使用过 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)