Grails, Spring Security y Siteminder: problemas con recursos o detalles de usuario

Estoy tratando de proteger mi aplicación Grails con Spring Security basándome en PreAuth by Siteminder. Eso es básicamente todo lo que necesito. La aplicación se usa solo para verificar algunas cosas, por lo que no se necesita una base de datos.

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

Al principio, solo usé RequestHeaderAuthenticationFilter y UserDetails y UserDetailsService personalizados.

Mis frijoles 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 configuré URL seguras como en todos los tutoriales sabios:

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 (que se dejan en el anonimato como se aconseja en algún tutorial):

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

Funcionaba 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 'filtros: ninguno' o 'seguridad: ninguno' para que Spring supiera qué solicitud de URL permitió sin verificar SM_USER.

Intenté agregar cosas a filter y filterChain:

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

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

pero no ayudó.

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

Así que 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 eso ayudó para las imágenes. Pero otro problema comenzó a ocurrir.

En lugar del objeto myUserDetails que debe devolverse cuando la autenticación es correcta, obtengo algún objeto String con bastante frecuencia. Y mi aplicación falla al no poder encontrar una propiedad en este objeto String (lo cual es bastante obvio ya que no está allí;))

¿Alguien sabe cómo lidiar con ese problema? Renunciar a mostrar imágenes no es una opción ;)

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

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

Gracias!

// EDIT: si por casualidad alguien está usando esto como referencia para configurar la seguridad de Siteminder sso, tenga en cuenta que debe agregar:

checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'

properties a su requestHeaderAuthenticationFilter. De lo contrario, se enfrentará a una Autoridad no actualizada en la sesión http cuando 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 beans a 'prototipo'.

preguntado el 03 de mayo de 12 a las 17:05

1 Respuestas

Si alguien está interesado, encontré algunas soluciones para este problema:

1. Solicite al administrador de SiteMinder que agregue el encabezado SM_USER a todas las imágenes o a algún conjunto de ellas limitado a la ubicación de la URL. Esto está deshabilitado de forma predeterminada debido al rendimiento general. Luego, suelte todos los filtros adicionales y viva feliz para siempre con preAuth one.

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

CÓMO:

Coloque todas las imágenes necesarias en var/www/yourfolder/images Agregue algunos alias a su configuración de httpd:

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

Reinicia tu servicio Sé feliz usando imágenes :D

Soy consciente de que esta no es la solución, sino solo una solución alternativa. Sin embargo, funciona. Todavía estaré feliz de escuchar algunas ideas mejores :)

Saludos.

contestado el 10 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.