2012-05-03 6 views
6

Ich versuche, meine Grals-Anwendung mit Federsicherheit basierend auf PreAuth von Siteminder zu sichern. Das ist alles, was ich brauche. Die Anwendung wird nur zum Überprüfen einiger Dinge verwendet, so dass keine Datenbank benötigt wird.Grails, Spring Security & Siteminder - Probleme mit Ressourcen oder userDetails

Ich stecke auf einigen Filterproblemen, die ich irgendwie nicht umfassen kann.

Zuerst verwendete ich nur RequestHeaderAuthenticationFilter und benutzerdefinierte UserDetails und UserDetailsService.

Meine Feder Bohnen:

beans = { 
    userDetailsService(MyUserDetailsService) 

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

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

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

Ich habe meine MyUserDetailsProvider:

class MyUserDetailsService implements GrailsUserDetailsService { 

    MyUserDetails loadUserByUsername(String username) throws UsernameNotFoundException{ 

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

ich auch gesichert URLs konfiguriert wie in jeder weise Tutorial:

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'] 
] 

und einigen Anbietern (links anonym wie in einigen Tutorials empfohlen):

Es funktionierte gut für den Datenzugriff, aber es wurde nicht erlaubt, Ressourcen, insbesondere Bilder zu laden. Der Fehler besagt, dass der SM_USER-Header in der Anfrage nicht gefunden wurde.

Also dachte ich, dass ich eine Lösung wie 'filters: none' oder 'security: none' verwenden könnte, so dass Spring weiß, welche URL-Anfrage ohne Überprüfung von SM_USER ablaufen lässt.

ich versuchte, indem Material zu filtern und zu filter:

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

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

aber es half nicht.

Dann habe ich versucht, einen anderen Filter für die Ressourcen ohne SM_USER-Header verwendet werden. Aus Referenz habe ich verstanden, dass anonymer Filter ausreichen könnte.

So habe ich einige Änderungen:

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, die für Bilder geholfen. Aber ein anderes Problem trat auf.

Anstelle des myUserDetails-Objekts, das zurückgegeben werden soll, wenn die Authentifizierung korrekt ist, erhalte ich ziemlich häufig ein String-Objekt. Und meine App ist nicht in der Lage, eine Eigenschaft in diesem String-Objekt zu finden (was ziemlich offensichtlich ist, da es nicht da ist;))

Kann jemand mit diesem Problem umgehen? Das Ausstellen von Bildern ist keine Option;)

Gibt es eine Möglichkeit, Bilder/andere Ressourcen von Filterchain im Frühjahr Sicherheit Grails Konfiguration auszuschließen ...? Genau wie es in normalen Java .xml Weg gemacht wurde ...?

Ich werde alle Hilfe und Vorschläge zu schätzen, wie Sie das lösen können.

Danke !!!

// EDIT: wenn vielleicht jemand hat dies als Referenz Sicherheit einzurichten für Siteminder sso Bitte beachten Sie, hinzuzufügen:

checkForPrincipalChanges = 'true' 
invalidateSessionOnPrincipalChange = 'true' 

Objekte zu Ihrem requestHeaderAuthenticationFilter. Andernfalls werden Sie beim Aufrufen von springSecurityService.getPrincipal() nicht mit der aktualisierten Authority in der http-Sitzung konfrontiert. Daher sind Benutzer möglicherweise "als jemand anderes angemeldet". :) Überlegen Sie auch, den Umfang Ihrer Bohnen auf "Prototyp" zu ändern.

Antwort

2

Wenn jemand interessiert ist - Ich fand einige Abhilfen für dieses Problem:

1. Stellen Sie Siteminder-Server-Betreiber SM_USER Header für alle Bilder oder bis zu einem gewissen Satz von ihnen beschränkt sich auf URL-Adresse hinzuzufügen. Dies ist aufgrund der allgemeinen Leistung standardmäßig deaktiviert. Dann verlieren Sie alle zusätzlichen Filter und leben glücklich mit preAuth one.

2. Verwendung statischer Inhalte statt, einschließlich der Bilder in .war und umleiten:]

HOW TO:

Legen Sie alle benötigten Bilder in var/www/Yourfolder/images einige Aliase hinzufügen Ihre httpd config:

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

Ihren Dienst neu starten Seien Sie glücklich mit Bildern: D

Ich bin mir bewusst, dass dies nicht die Lösung, sondern nur Workaround ist. Aber es funktioniert. Ich werde immer noch glücklich sein, ein paar bessere Ideen zu hören :)

Prost.

Verwandte Themen