如何在使用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端获得这些属性?

+1

也许我应该重写的UserDetails和UserDetailsS​​ervice的类来添加自己的自定义属性。问题是我如何获取UserDetailsS​​ervice类的loadUserByUsername(..)方法下的用户数据。 – 2012-07-13 06:23:08

这样的自定义属性应该放在你的UserDetails接口的实现或者User类的扩展中。 在http://static.springsource.org/spring-security/site/docs/3.1.x/reference/preauth.html中,您可以找到该场景如何实现AuthenticationUserDetailsS​​ervice。

一旦你这样做,你可以查询SecurityContextHolder中,让您的UserDetails实现

SecurityContextHolder.getContext().getAuthentication().getPrincipal()