使用ip地址和用户名密码进行spring安全认证

时间:2014-03-04 11:54:05

标签: spring spring-security

我正在使用loadUserByUsername方法对用户进行身份验证,但是,我还需要针对允许的IP地址进行验证。

但是当我在尝试时

SecurityContextHolder.getContext().getAuthentication(); 

变空。

请告知我如何在验证用户时访问用户的客户端IP地址。

3 个答案:

答案 0 :(得分:5)

要解决您的问题,您应该实现自定义身份验证提供程序(可以基于DaoAuthenticationProvider,也可以从头开始实施)等。此身份验证提供程序应在Authentication Manager提供程序集中注册。此外,此提供程序将具有与上下文http请求相关的自动装配的HttpServletRequest类型属性。然后,当您通过该提供程序执行客户端身份验证时,可以通过调用HttpServletRequest.getRemoteAddr()来获取用户IP地址。 代码:

/**
 * 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)
    }
}

配置:

<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>

此外,您还可以添加其他身份验证提供程序(如果需要)。 希望这可以帮助。 链接:AuthenticationProvider ProviderManager

答案 1 :(得分:3)

/**
 * 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();
    }
}

答案 2 :(得分:1)

您正在实施UserDetailsS​​ervice的loadUserByUsername方法。

根据文件 关于UserDetailsS​​ervice经常会有一些混乱。它纯粹是用户数据的DAO,除了将数据提供给框架内的其他组件之外,不执行任何其他功能。特别是,它不会对用户进行身份验证,这是由AuthenticationManager完成的。在许多情况下,如果您需要自定义身份验证过程,则直接实现AuthenticationProvider会更有意义。

UserDetails userDetails= customUserDetailsService.loadUserByUsername("name"); 

这将给出userDetails对象。您可以在loadUserByUsername()中执行所有与权限相关的代码。如果您想在Spring Security中手动设置经过身份验证的用户。请按照代码

 Authentication authentication= new  UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ;  
                SecurityContextHolder.getContext().setAuthentication(authentication);

您将从请求标题中获取IP地址。

How can I retrieve IP address from HTTP header in Java

你可以在spring security filterchain中的某个地方做到这一点。