2012-05-03 29 views
6

Estoy tratando de proteger mi aplicación Grails con seguridad de primavera basándose en preAuth por Siteminder. Eso es básicamente todo lo que necesito. La aplicación se usa solo para verificar algunas cosas, así que no hay necesidad de una base de datos.Grails, Spring Security & Siteminder - problemas con los recursos o userDetails

Estoy atascado en algunos problemas de filtro que de alguna manera no puedo abarcar.

Al principio solo usé RequestHeaderAuthenticationFilter y UserDetails personalizado y UserDetailsService.

Mis granos de primavera:

beans = { 
    userDetailsService(MyUserDetailsService) 

    userDetailsServiceWrapper(UserDetailsByNameServiceWrapper) { 
      userDetailsService = ref('userDetailsService') 
    } 

    preauthAuthProvider(PreAuthenticatedAuthenticationProvider) { 
      preAuthenticatedUserDetailsService = ref('userDetailsServiceWrapper') 
    } 

    requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter){ 
     principalRequestHeader='SM_USER' 
     authenticationManager = ref('authenticationManager') 
    } 
} 

tengo mi MyUserDetailsProvider:

class MyUserDetailsService implements GrailsUserDetailsService { 

    MyUserDetails loadUserByUsername(String username) throws UsernameNotFoundException{ 

     //some super secret code here ;) 
     return new MyUserDetails(some needed params) 
    } 
} 

También he configurado URL garantizados como en cualquier tutorial sabia:

grails.plugins.springsecurity.interceptUrlMap = [ 
    '/user/**':['ROLE_MINE'], 
    '/activation/**':['ROLE_SOMEOTHER, ROLE_MINE'], 
    '/js/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/css/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/*':   ['IS_AUTHENTICATED_ANONYMOUSLY'] 
] 

y algunos proveedores (izquierda anónimo según lo aconsejado en algún tutorial):

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider'] 

Funcionó muy bien para el acceso a los datos pero no permitía cargar recursos, imágenes en particular. El error decía que el encabezado SM_USER no se encontró en la solicitud.

Así que pensé que podía usar alguna solución como 'filters: none' o 'security: none' para que spring sabrá lo que me pide la URL sin verificar SM_USER.

He intentado añadir cosas para filtrar y filterChain:

grails.plugins.springsecurity.filterNames = ['requestHeaderAuthenticationFilter'] 

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/user/**': 'requestHeaderAuthenticationFilter', 
    '/activation/**': 'requestHeaderAuthenticationFilter', 
    '/*': 'requestHeaderAuthenticationFilter' 
] 

pero no sirvió de nada.

Luego intenté usar algún otro filtro para usar en los recursos sin el encabezado SM_USER. Por referencia entendí que el filtro Anonymous podría ser suficiente.

E hice algunos cambios:

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider'] 

grails.plugins.springsecurity.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter'] 

grails.plugins.springsecurity.filterChain.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter' 

]

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/user/**': 'requestHeaderAuthenticationFilter', 
    '/versionone/**': 'requestHeaderAuthenticationFilter', 
    '/activation/**': 'requestHeaderAuthenticationFilter', 
    '/js/**': 'anonymousAuthenticationFilter', 
    '/css/**': 'anonymousAuthenticationFilter', 
    '/images/**': 'anonymousAuthenticationFilter', 
    '/*': 'requestHeaderAuthenticationFilter' 
] 

YAY que ayudaron para las imágenes. Pero otro problema comenzó a ocurrir.

En lugar del objeto myUserDetails que debe devolverse cuando auth es correcto, estoy obteniendo algún objeto String con bastante frecuencia. Y mi aplicación está fallando en la incapacidad de encontrar una propiedad en este objeto String (lo cual es bastante obvio ya que no está allí;))

¿Alguien sabe cómo manejar ese problema? La renuncia de mostrar imágenes no es una opción;)

¿Hay alguna forma de excluir imágenes/otros recursos de filterchain en la configuración de Spring Spring Grails ...? Al igual que se hizo en Java normal .xml forma ...?

Agradeceré toda la ayuda y sugerencias sobre cómo solucionar esto.

Gracias !!!

// EDIT: si por casualidad alguien está usando esto como una referencia para configurar la seguridad de siteminder sso, tenga en cuenta que añadir:

checkForPrincipalChanges = 'true' 
invalidateSessionOnPrincipalChange = 'true' 

propiedades a su requestHeaderAuthenticationFilter. De lo contrario, se tratará con una Autoridad no actualizada en la sesión http cuando se llame a springSecurityService.getPrincipal(), por lo que los usuarios podrían 'iniciar sesión como otra persona'. :) También considere cambiar el alcance de sus granos a 'prototipo'.

Respuesta

2

Si alguien está interesado - He encontrado algunas soluciones para este problema:

1. Pregunte SiteMinder de administración para añadir cabecera SM_USER a todas las imágenes o para algún conjunto de los que sólo tenga lugar url. Esto está deshabilitado por defecto debido al rendimiento general. Luego, suelta todos los filtros adicionales y vive feliz para siempre con preAuth one.

2. Uso contenido estático en lugar de incluir imágenes en .war y redirigir:]

Cómo:

Ponga todas las imágenes necesarias en/var/www/YourFolder imágenes añadir un poco de alias para su configuración httpd:

Alias /yourapp/imgs var/www/yourfolder/images 
ProxyPass /yourapp/imgs ! 

Reinicie el servicio de ser feliz a partir de imágenes: D

Soy consciente de que esta no es la solución, sino solo una solución alternativa. Sin embargo, funciona. Estaré contento de escuchar algunas mejores ideas :)

Cheers.

Cuestiones relacionadas