Autenticando por endereço IP na Primavera 3.1: maneira mais inteligente de fazer isso?
Eu implementei a autenticação LDAP usando o Spring Security 3.1. Meu arquivo security.xml para isso é postado abaixo.
Preciso alterar meu processo de autenticação para que, se um usuário acessar o site de um endereço IP em uma "lista branca" (mantida em uma tabela de banco de dados), esse usuário seja autenticado automaticamente no Spring 3.1 e redirecionado para fora do site tela de login (não é minha idéia, me disseram para isso).
Se o usuário não é de um dos endereços IP listados em branco, ele deve ser forçado a passar pela autenticação LDAP na página de login.
Sou novo no Spring e Spring Security, então fui aoPrimavera 3.1 Documentação de Referência e leia toda a Seção I. Lá, eu li o conselho de que se você tem alguma autenticação especial precisa lerSeção II Arquitetura e Implementação. Eu fiz isso muito devagar e tomei notas.
No entanto, desde que eu sou novo em tudo isso, não tenho certeza se entendi completamente o que preciso fazer e qual é a maneira mais inteligente de fazê-lo.
Atualização 3: Eu tenho o código esqueleto para funcionar, aqui estão os arquivos que acabei com
Minha implementação AuthenticationProvider personalizada para autenticação por endereço IP
<code>// Authentication Provider To Authenticate By IP Address With Allowed IPs // Stored in a db table package acme.com.controller.security; //import acme.com.controller.security.CustomUserInfoHolder; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UserDetails; import org.apache.log4j.Logger; public class CustomIPAddressAuthenticationProvider implements AuthenticationProvider { private static final Logger logger = Logger.getLogger(CustomIPAddressAuthenticationProvider.class); private GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper(); @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { WebAuthenticationDetails wad = null; String userIPAddress = null; boolean isAuthenticatedByIP = false; // Get the IP address of the user tyring to use the site wad = (WebAuthenticationDetails) authentication.getDetails(); userIPAddress = wad.getRemoteAddress(); logger.debug("userIPAddress == " + userIPAddress); // Compare the user's IP Address with the IP address in the database // stored in the USERS_AUTHENTICATED_BY_IP table & joined to the // USERS tabe to make sure the IP Address has a current user //isAuthenticatedByIP = someDataObject.hasIPAddress(userIPAddress); isAuthenticatedByIP = true; // Authenticated, the user's IP address matches one in the database if (isAuthenticatedByIP) { logger.debug("isAuthenticatedByIP is true, IP Addresses match"); UserDetails user = null; UsernamePasswordAuthenticationToken result = null; result = new UsernamePasswordAuthenticationToken("John Principal", "PlaceholderPWE"); result.setDetails(authentication.getDetails()); return result; } // Authentication didn't happen, return null to signal that the // AuthenticationManager should move on to the next Authentication provider return null; } @Override public boolean supports(Class<? extends Object> authentication) { // copied it from AbstractUserDetailsAuthenticationProvider return(UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); } } </code>
Meu arquivo * -security.xml
<code><beans xmlns="http://www.springframework.org/schema/beans" xmlns:s="http://www.springframework.org/schema/security" 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-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <s:http pattern="/login*" security="none"/> <s:http pattern="/search*" security="none"/> <s:http pattern="/css/**" security="none"/> <s:http pattern="/js/**" security="none"/> <s:http pattern="/images/**" security="none"/> <s:http auto-config="true" use-expressions="true"> <s:intercept-url pattern="/**" access="isAuthenticated()" /> <s:form-login login-page="/login" authentication-failure-url="/loginfailed" /> <s:logout logout-success-url="/logout" /> </s:http> <s:ldap-server url = "ldap://ldap-itc.smen.acme.com:636/o=acme.com"/> <bean id="customIPAddressAuthenticationProvider" class="com.acme.controller.security.CustomIPAddressAuthenticationProvider" /> <s:authentication-manager> <!-- Proposed: Custom Authentication Provider: Try To Authenticate BY IP Address First, IF NOT, Authenticate WiTh THE LDAP Authentication Provider --> <s:authentication-provider ref="customIPAddressAuthenticationProvider" /> <s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People"/> </s:authentication-manager> </beans> </code>