我正在使用loadUserByUsername方法对用户进行身份验证,但是,我还需要针对允许的IP地址进行验证。
但是当我在尝试时
SecurityContextHolder.getContext().getAuthentication();
变空。
请告知我如何在验证用户时访问用户的客户端IP地址。
答案 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)
您正在实施UserDetailsService的loadUserByUsername方法。
根据文件 关于UserDetailsService经常会有一些混乱。它纯粹是用户数据的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中的某个地方做到这一点。