Estoy desarrollando una aplicación basada en Spring Java y quiero usar Apache Directory Studio ldap para administrar usuarios, así que quiero darle a cada usuario un rol y administrar que usé Spring Security.
Este es mi contexto de seguridad.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security" 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-4.2.xsd"> <security:authentication-manager> <security:ldap-authentication-provider user-search-filter="(uid={0})" user-search-base="ou=users" group-search-filter="(uniqueMember={0})" group-search-base="ou=groups" group-role-attribute="cn" role-prefix="ROLE_" /> </security:authentication-manager> <security:ldap-server url="ldap://localhost:8389/o=mojo" manager-dn="uid=admin,ou=system" manager-password="secret" /> <security:http use-expressions="true"> <security:intercept-url pattern="/" access="hasRole('ROLE_Admin')" /> <security:form-login /> </security:http>y esta es mi jerarquía ldap
Eso no funciona para mí y me da un error 403 por acceso denegado incluso cuando inicio sesión con credenciales de administrador.
Alguna ayuda ?
Intente establecer su rol en <security:intercept-url pattern="/" access="hasRole('ROLE_ADMIN')" /> en mayúsculas de esta manera.
Por defecto <security:ldap-authentication-provider /> , que configura automáticamente un org.springframework.security.ldap.authentication.LdapAuthenticationProvider crea una instancia de org.springframework.security.ldap.userdetails.LdapUserDetailsMapper que por defecto tiene estas propiedades:
public class LdapUserDetailsMapper implements UserDetailsContextMapper { // ~ Instance fields // ================================================================================================ private final Log logger = LogFactory.getLog(LdapUserDetailsMapper.class); private String passwordAttributeName = "userPassword"; private String rolePrefix = "ROLE_"; private String[] roleAttributes = null; private boolean convertToUpperCase = true;Y así sucesivamente, como convertToUpperCase se establece en verdadero, este método
/** * Creates a GrantedAuthority from a role attribute. Override to customize authority * object creation. * <p> * The default implementation converts string attributes to roles, making use of the * <tt>rolePrefix</tt> and <tt>convertToUpperCase</tt> properties. Non-String * attributes are ignored. * </p> * * @param role the attribute returned from * @return the authority to be added to the list of authorities for the user, or null * if this attribute should be ignored. */ protected GrantedAuthority createAuthority(Object role) { if (role instanceof String) { if (this.convertToUpperCase) { role = ((String) role).toUpperCase(); } return new SimpleGrantedAuthority(this.rolePrefix + role); } return null; } finalmente convierte su ou:groups Admin a ROLE_ADMIN , que no coincide con ROLE_Admin
el error fue que en mi jerarquía LDAP debo llamar al grupo cn=ROLE_ADMIN no cn=Admin porque tengo role-prefix="ROLE_" en mi archivo security-context.xml