如何在使用JOSSO和Spring Security的Grails应用程序中从LDAP获取定制属性?
问题描述:
我已经成功地将JOSSO和Spring Security应用程序集成到我的Grails应用程序中(使用LDAP进行用户控制)。如何在使用JOSSO和Spring Security的Grails应用程序中从LDAP获取定制属性?
由于JOSSO已经管理身份验证,因此我使用Spring Security集成的“预验证方案”。这是我与春季安全配置resources.groovy
内容:
def developmentEnvironment = {
if (grailsApplication.config.grails.plugins.springsecurity.active) {
preAuthenticatedAuthenticationProvider(PreAuthenticatedAuthenticationProvider) {
preAuthenticatedUserDetailsService = ref('preAuthenticatedUserDetailsService')
}
preAuthenticatedUserDetailsService(PreAuthenticatedGrantedAuthoritiesUserDetailsService) {
}
j2eePreAuthFilter(J2eePreAuthenticatedProcessingFilter) {
authenticationManager = ref('authenticationManager')
authenticationDetailsSource = {
J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource authenticationDetailsSource ->
mappableRolesRetriever = {
SimpleMappableAttributesRetriever mappableAttributesRetriever ->
mappableAttributes = ['app_admin', 'app_user', 'app_report', 'app_access'] as Set
}
userRoles2GrantedAuthoritiesMapper = {
SimpleAttributes2GrantedAuthoritiesMapper grantedAuthoritiesMapper ->
convertAttributeToUpperCase = "true"
}
}
}
preAuthenticatedProcessingFilterEntryPoint(Http403ForbiddenEntryPoint) {
}
preAuthenticatedExceptionTranslationFilter(ExceptionTranslationFilter) {
authenticationEntryPoint = ref('preAuthenticatedProcessingFilterEntryPoint')
}
}
}
一切工作正常,我可以访问Grails的侧面默认属性(例如使用springSecurityService
)。
但现在我有一个新的要求,从LDAP获取自定义属性(例如ownership
)。所以,我将这些属性添加到LDAP下的我的用户,据我所知JOSSO会自动获得这些属性,但我无法在grails应用程序端获得这些属性。 有什么办法可以在Grails端获得这些属性?
答
这样的自定义属性应该放在你的UserDetails接口的实现或者User类的扩展中。 在http://static.springsource.org/spring-security/site/docs/3.1.x/reference/preauth.html中,您可以找到该场景如何实现AuthenticationUserDetailsService。
一旦你这样做,你可以查询SecurityContextHolder中,让您的UserDetails实现
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
也许我应该重写的UserDetails和UserDetailsService的类来添加自己的自定义属性。问题是我如何获取UserDetailsService类的loadUserByUsername(..)方法下的用户数据。 – 2012-07-13 06:23:08