使用 grails spring security rest 插件登录时获取用户详细信息
Posted
技术标签:
【中文标题】使用 grails spring security rest 插件登录时获取用户详细信息【英文标题】:Get user details when login using grails spring security rest plugin 【发布时间】:2016-03-27 05:39:32 【问题描述】:我正在使用 grails spring 安全插件。当我登录时,我将用户名、令牌和角色作为 json 响应。除了这些属性,我还想获取一些其他属性,例如名字、姓氏等。使用 grails spring security rest 插件登录应用程序时,如何将这些值作为 json 响应获取?
【问题讨论】:
据我所知,您需要使用用户详细信息向令牌添加声明,您可以使用springSecurityService?.currentUser
,并从那里获取用户详细信息
在登录时我想获取详细信息而不是再次请求登录用户
@Jagadeesh 你解决了吗?
没有。如果本地存储中的用户对象为空,我已经完成了单独的休息调用
【参考方案1】:
您可以添加令牌声明,我通常建议不要修改插件代码,但是
您可以通过在中添加新声明来添加所需的详细信息
AbstractJwtTokenGenerator
(或者最好覆盖它)
JWTClaimsSet generateClaims(UserDetails details, String serializedPrincipal, Integer expiration)
JWTClaimsSet claimsSet = new JWTClaimsSet()
claimsSet.setSubject(details.username)
log.debug "Setting expiration to $expiration"
Date now = new Date()
claimsSet.setIssueTime(now)
use(TimeCategory)
claimsSet.setExpirationTime(now + expiration.seconds)
claimsSet.setCustomClaim('roles', details.authorities?.collect it.authority )
claimsSet.setCustomClaim('principal', serializedPrincipal)
//claimsSet.setCustomClaim('username', details.getUsername()) //added customized user name claim
log.debug "Generated claim set: $claimsSet.toJSONObject().toString()"
return claimsSet
注意:claimsSet.setSubject(details.username)
中的主题已经包含用户名
【讨论】:
【参考方案2】:根据docs:
如果您想在 JSON 响应中呈现其他信息, 你必须:
配置一个替代的 userDetailsService bean,用于检索您想要的附加信息,并将其放入主体对象中。
配置一个备用 accessTokenJsonRenderer,从 restAuthenticationToken.principal 对象读取该信息。
关于userDetailsService 和accessTokenJsonRenderer 的其他信息
【讨论】:
以上是关于使用 grails spring security rest 插件登录时获取用户详细信息的主要内容,如果未能解决你的问题,请参考以下文章
Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密
使用 Spring Security Grails 插件编码密码
Grails + spring-security-core:用户登录后如何分配角色?