OK I finally did it.
I had to extend the pre-auth filter to do the workaround, UserDetails and implements Authentication
Here it is :
Code:
<beans:bean id="preauthAuthProvider"
class="org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationProvider">
<security:custom-authentication-provider />
<beans:property name="preAuthenticatedUserDetailsService">
<beans:bean id="userDetailsServiceWrapper"
class="org.springframework.security.userdetails.UserDetailsByNameServiceWrapper">
<beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean id="siteMinderFilter"
class="toto.tata.SiteMinderFilter">
<security:custom-filter position="PRE_AUTH_FILTER" />
<beans:property name="principalRequestHeader"
value="SM_USER" />
<beans:property name="rolesRequestHeader"
value="SM_ROLES" />
<beans:property name="rolesDelimiter"
value=";" />
<!-- other request headers names can be inserted here -->
<beans:property name="authenticationManager"
ref="authenticationManager" />
</beans:bean>
<security:authentication-manager alias="authenticationManager" />
<beans:bean id="userDetailsService"
class="toto.tata.SiteMinderUserDetailsService" />
SiteMinderFilter.java :
Code:
[...]
//not sure if required
public SiteMinderFilter(String pPrincipalRequestHeader) {
super();
super.setPrincipalRequestHeader(pPrincipalRequestHeader);
}
public void doFilterHttp(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
// get roles
String roles = (String) request.getHeader(getRolesRequestHeader());
String[] rolesArray = roles.split(this.getRolesDelimiter());
// put roles in GrantedAuthority[]
Collection<GrantedAuthorityImpl> container = new ArrayList<GrantedAuthorityImpl>();
for (String s : rolesArray) {
container.add(new GrantedAuthorityImpl(s));
}
GrantedAuthority[] gAuth = (GrantedAuthority[]) container
.toArray(new GrantedAuthority[container.size()]);
// create user details
SiteMinderUserDetails userDetails = new SiteMinderUserDetails();
userDetails.setUsername((String) super
.getPreAuthenticatedPrincipal(request));
userDetails.setAuthorities(gAuth);
// forge our own Authentication object
AuthenticationImpl authentication = new AuthenticationImpl();
authentication.setAuthenticated(true);
authentication.setAuthorities(gAuth);
authentication.setPrincipal(userDetails);
authentication.setCredentials(super
.getPreAuthenticatedCredentials(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
super.doFilterHttp(request, response, filterChain);
}
UserDetails is just a box to put your user data and Authentication just has the attributes and getters required by the interface.
Hope this helps someone.