spring - mvc - autenticación de seguridad de primavera utilizando la dirección IP y la contraseña de usuario
spring mvc español (3)
Para resolver su problema, debe implementar un proveedor de autenticación personalizado (que puede estar basado en DaoAuthenticationProvider
o puede implementarse desde cero, etc.). Este proveedor de autenticación debe estar registrado en el conjunto de proveedores del administrador de autenticación. Además, este proveedor tendrá la propiedad de tipo HttpServletRequest HttpServletRequest
, relacionada con la solicitud HTTP de contexto. Luego, cuando realiza autenticación de HttpServletRequest.getRemoteAddr()
través de ese proveedor, puede obtener la dirección IP de usuario invocando HttpServletRequest.getRemoteAddr()
. Código:
/**
* IP address based authentication provider
*/
@Service
public class IPAddressBasedAuthenticationProvider extends AuthenticationProvider {
/**
* Context http request
*/
@Autowired
private HttpServletRequest request;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String ipAddress = request.getRemoteAddr();
//do authentication specific stuff (accessing users table in database, etc.)
//return created authentication object (if user provided valid credentials)
}
}
Configuración:
<security:http auto-config="true" authentication-manager-ref="authenticationManager" use-expressions="true"/>
<bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<constructor-arg name="providers">
<list>
<ref bean="iPAddressBasedAuthenticationProvider"/>
</list>
</constructor-arg>
</bean>
Además, puede agregar otros proveedores de autenticación (si es necesario). Espero que esto ayude. Enlaces: AuthenticationProvider ProviderManager
Estoy utilizando el método loadUserByUsername para autenticar al usuario, sin embargo, también debo validar contra direcciones IP permitidas.
Pero cuando intento
SecurityContextHolder.getContext().getAuthentication();
obteniendo nulo.
Por favor, consulte cómo puedo acceder a la dirección IP del cliente de los usuarios mientras autentico al usuario.
Está implementando el método loadUserByUsername de UserDetailsService.
Según la documentación A menudo existe cierta confusión sobre UserDetailsService. Es puramente un DAO para los datos del usuario y no realiza ninguna otra función que no sea suministrar esos datos a otros componentes dentro del marco. En particular, no autentica al usuario, lo que hace el AuthenticationManager. En muchos casos, tiene más sentido implementar AuthenticationProvider directamente si requiere un proceso de autenticación personalizado.
UserDetails userDetails= customUserDetailsService.loadUserByUsername("name");
esto le dará un objeto userDetails. Puede hacer todo el código relacionado con la autoridad en loadUserByUsername (). Si desea configurar manualmente un usuario autenticado en Spring Security, siga el código.
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ;
SecurityContextHolder.getContext().setAuthentication(authentication);
Obtendrá la dirección IP del encabezado de la solicitud.
¿Cómo puedo recuperar la dirección IP del encabezado HTTP en Java?
puedes hacer eso en algún lugar de la cadena de filtros de seguridad de primavera.
/**
* IP address based authentication provider
*/
@Service
public class IPAddressBasedAuthenticationProvider extends AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
final WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
details.getRemoteAddress();
}
}