首先第一个问题,设置hasIpAddress的方法为:
在实现WebSeurityConfig配置文件中的WebSecurity部分设置,例如
http.authorizeRequests().antMatchers("/admin/user/getByUserName").access("hasIpAddress('127.0.0.1')...
当通过服务发现方式来调用时,由于客户机可能存在多个网卡的情况,导致这个配置IP不准确的情况,这个时候需要通过Spring Security Web源码部分进行分析,可以得知。
1、Spring Security是通过FilterChainProxy来根据设置过滤器进行拦截处理的。
2、IP地址的过滤时通过FilterSecurityInterceptor调用DefaultSecurityExpressionHandler进行Ip地址的匹配情况的,这里可以获得客户机请求的地址request.getRemoteAddr(),这样可以知道配置那个IP作为白名单了。
public class CustomWebSecurityExpressionHandler extends AbstractSecurityExpressionHandler<FilterInvocation>
implements SecurityExpressionHandler<FilterInvocation> {
private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
private String defaultRolePrefix = "ROLE_";
@Override
protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
WebSecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
System.out.println("=================================" + fi.getRequest().getRemoteAddr());
root.setPermissionEvaluator(getPermissionEvaluator());
root.setTrustResolver(this.trustResolver);
root.setRoleHierarchy(this.getRoleHierarchy());
root.setDefaultRolePrefix(this.defaultRolePrefix);
return root;
}
当然也可以重写DefaultSecurityExpressionHandler方法自由的获取request.getRemoteAddr()的相关信息,这是需要在WebSeurityConfig中声明Bean,并设定为使用的Handler。代码如下:
@Bean
public SecurityExpressionHandler<FilterInvocation> customWebSecurityExpressionHandler() {
return new CustomWebSecurityExpressionHandler();
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().expressionHandler(customWebSecurityExpressionHandler())
....
}