Spring Boot Security学习:支持接收前端登录json格式

spring security简介

主要的核心功能就是:

  1. 认证
  2. 授权
  3. 攻击防护

支持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);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值