前面我们实现的filter中对拦截的路径、要检查是否登录、是否有权限访问的请求模式都采用的硬编码的形式,这种分散在代码中的形式对它们很难集中维护,为此我们可以将其添加到应用配置中,开干!
定义属性类
package com.xiaojuan.boot.properties;
import ...
@Component
@ConfigurationProperties(prefix = "auth")
@Data
public class AuthProperties {
private List<String> filterUrls;
private List<String> needLoginUrlPatterns;
private List<String> needAdminRoleUrlPatterns;
}
注意,它是一个组件类,在需要读取配置的方法我们将注入它。只要匹配application.yml中以auth的key开头的配置就能由spring boot自动注入进来。
自定义yaml配置
在application.yml中加入自定义的yaml配置:
auth:
filter-urls:
- /user/*
- /admin/*
need-login-url-patterns:
- /user/profile
- /user/signature
- /admin/**
need-admin-role-url-patterns:
- /admin/**
应用配置类
WebConfig.java
package com.xiaojuan.boot.web;
import ...
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private AuthProperties authProperties;
...
@Bean
public FilterRegistrationBean<BasicAuthFilter> basicAuthFilterBean(){
...
String[] urls = authProperties.getFilterUrls().toArray(new String[0]);
bean.addUrlPatterns(urls);
...
}
}
BasicAuthFilter.java
package com.xiaojuan.boot.web.filter;
import ...
@Slf4j
public class BasicAuthFilter extends BasicRequestFilter {
...
@Resource
private AuthProperties authProperties;
...
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
...
if (matchUri(uri, authProperties.getNeedLoginUrlPatterns()) && userInfo == null) {
// 抛出异常
}
if (matchUri(uri, authProperties.getNeedAdminRoleUrlPatterns())) {
// 校验管理员身份
}
filterChain.doFilter(request, response);
}
...
}
这样就做到了从application.yml中读取我们自定义的配置了。
测试
最后,我们所有的修改都不要忘了运行单元测试来保障改造不影响功能模块,运行下UserControllerTest,ok!