spring security简介
主要的核心功能就是:
- 认证
- 授权
- 攻击防护
支持spring security接收json格式
其实最要的就是重写UsernamePasswordAuthenticationFilter这个过滤器。
这个类的主要目的就是用于处理基于表单的登录请求,从表单中获取用户名和密码。默认就是username和password。也可以修改这两个值,只需要调用他的两个方法。
接下来重写UsernamePasswordAuthenticationFilter这个类。
重写attemptAuthentication这个方法。
代码和UsernamePasswordAuthenticationFilter代码差不多,只需要修改几个地方就行了。
和源码代码就多了几处地方,首先判断是否是POST请求,如果不是就抛给spring处理。
从requst里面获取前端输入的json值转为Map形式。
把获取的值放到验证类里面。
其余的都和源码一样。
如果不是json格式的值,那么就直接调用父类去处理就行。
支持security接收json格式的代码就写好了,然后配置spring security就行了。
public class LoginFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication
(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
//判断请求方法是否是post
if (!"POST".equals(request.getMethod())) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
} else {
//判断请求头的content是否是json格式。
if (request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE)
|| request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) {
Map<String, String> map;
UsernamePasswordAuthenticationToken authRequest = null;
try {
//转换输入的json数据为map格式
map = new ObjectMapper().readValue(request.getInputStream(), Map.class);
//获取username的值
String username = map.get(getUsernameParameter());//getUsernameParameter:username
//获取password
String password = map.get(getPasswordParameter());//getPasswordParameter:password
//设置值
authRequest = new UsernamePasswordAuthenticationToken(username, password);
} catch (IOException e) {
e.printStackTrace();
authRequest = new UsernamePasswordAuthenticationToken("", "");
} finally {
//发送给UserDetailsService信息
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
}
//直接调用父类处理key和value这种formData类型
return super.attemptAuthentication(request, response);
}
}
}
配置spring security。
@Bean
LoginFilter loginFilter() throws Exception {
LoginFilter lf = new LoginFilter();
//登录成功的处理器
// lf.setAuthenticationSuccessHandler();
//登录失败的处理器
// lf.setAuthenticationFailureHandler();
//设置需要过滤的url
lf.setFilterProcessesUrl("/shanjun/login");
//重用WebSecurityConfigurerAdapter配置的AuthenticationManager,不然要自己组装AuthenticationManager
//必须要设置,不要会启动报错
lf.setAuthenticationManager(authenticationManagerBean());
return lf;
}
在configure(HttpSecurity http)方法里添加重写的过滤器
后面的参数就是被重写的过滤器类。
//添加自定义的过滤器
http.
addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class);