Configurar spring-security con Liberty Profile

Si deseamos tener autenticación delegada en el contenedor con spring security (esto es para verSpring_Framework_logosión 4) y el servidor liberty profile de ibm aquí os dejo el contenido de los ficheros de configuración para que lo hagais en un periquete.

Esto de lo que se trata es muy sencillo, un proceso de validación de usuario se compone de 2 tareas independientes, la autenticación y la autorización.

La autenticación es decir “si, este usuario existe” y la autorización es “¿este usuario que hemos comprobado que existe tiene permisos para acceder a esta página?”.

Con esta configuración delegamos la autenticación en el servidor, aquí están configurados los usuarios directamente en el server.xml pero podrías configurar un openldap por ejemplo y funcionaría igualmente.

La autorización como podeis ver está configurada a través del fichero de configuración de spring asignando diferentes accesos dependiendo de los roles que nos haya devuelto la autenticación.

spring-security.xml


<beans:beans xmlns:sec="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref='preAuthenticatedAuthenticationProvider' />
</sec:authentication-manager>

<beans:bean id="preAuthenticatedAuthenticationProvider"    class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService" />
</beans:bean>

<beans:bean id="preAuthenticatedUserDetailsService" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedGrantedAuthoritiesUserDetailsService" />

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<sec:filter-chain-map path-type="ant">

<sec:filter-chain pattern="/*" filters="sif,j2eePreAuthFilter,logoutFilter,etf,fsi" />
</sec:filter-chain-map>
</beans:bean>

<beans:bean id="sif"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter" />
<h2></h2>
<beans:bean id="j2eePreAuthFilter" class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter" >
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationDetailsSource">
<beans:bean class="org.springframework.security.web.authentication.preauth.j2ee.J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource">
<beans:property name="mappableRolesRetriever">
<beans:bean class="org.springframework.security.web.authentication.preauth.j2ee.WebXmlMappableAttributesRetriever" />
</beans:property>
<beans:property name="userRoles2GrantedAuthoritiesMapper">
<beans:bean class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper">
<beans:property name="convertAttributeToUpperCase" value="true" />
</beans:bean>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
<beans:constructor-arg value="/index" />
<beans:constructor-arg>
<beans:list>
<!-- Si se implementa el logout salta un classcastexception. El error del logout es un bug de liberty profile
http://www-01.ibm.com/support/docview.wss?uid=swg1PM90897
-->
<beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" />
</beans:list>
</beans:constructor-arg>
</beans:bean>

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

<beans:bean id="etf" class="org.springframework.security.web.access.ExceptionTranslationFilter">
<beans:property name="authenticationEntryPoint" ref="preAuthenticatedProcessingFilterEntryPoint" />
</beans:bean>

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />

<beans:bean id="httpRequestAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<beans:property name="allowIfAllAbstainDecisions" value="false" />
<beans:property name="decisionVoters">
<beans:list>
<beans:ref bean="roleVoter" />
</beans:list>
</beans:property>
</beans:bean>

<beans:bean id="fsi" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="accessDecisionManager" ref="httpRequestAccessDecisionManager" />
<beans:property name="securityMetadataSource">

<sec:filter-invocation-definition-source>
<sec:intercept-url pattern="/admin/*" access="ROLE_ADMINS" />
<sec:intercept-url pattern="/usuarios/*" access="ROLE_USUARIOS" />
</sec:filter-invocation-definition-source>
</beans:property>
</beans:bean>

</beans:beans>

server.xml


<featureManager>
<!-- AUTENTICACION DELEGADA EN CONTENEDOR -->
<feature>ssl-1.0</feature>
<feature>ldapRegistry-3.0</feature>
<feature>appSecurity-2.0</feature>
<feature>localConnector-1.0</feature>
</featureManager>

<!-- AUTENTICACION BASICA -->
<basicRegistry id="basic" realm="customRealm">
<user name="admin" password="{xor}Pi0uKjYrOjwrKi0+" />
<user name="user" password="{xor}Pi0uKjYrOjwrKi0+" />
<group name="admins">
<member name="admin"  />
</group>
<group name="usuarios">
<member name="user" />
</group>
</basicRegistry>
<administrator-role>
<user>admin</user>
<group>admin</group>
</administrator-role>

<webApplication contextRoot="SpringArquitectura" id="spring-sample-app-web"
location="spring-sample-app-web.war" name="spring-sample-app-web">
<application-bnd>
<security-role name="ROLE_USUARIOS">
<group name="usuarios" />
</security-role>
<security-role name="ROLE_ADMINS">
<group name="admins" />
</security-role>
</application-bnd>
</webApplication>

web.xml


<!-- Spring Security -->

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<security-constraint>
<display-name>Only employees allowed</display-name>
<web-resource-collection>
<web-resource-name>All resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ROLE_USUARIOS</role-name>
<role-name>ROLE_ARQUITECTOS</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>customRealm</realm-name>
<form-login-config>
<form-login-page>/login</form-login-page>
<form-error-page>/loginfailed</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>ROLE_USUARIOS</role-name>
</security-role>
<security-role>
<role-name>ROLE_ADMINS</role-name>
</security-role>

Anuncios