Spring Security基于json登录实现过程详解

 更新时间:2020年08月17日 09:22:30   作者:柒丶月  
这篇文章主要介绍了Spring Security基于json登录实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

主要是重写attemptAuthentication方法

导入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

相关配置和代码

application.properties配置密码

spring.security.user.name=admin
spring.security.user.password=123

创建自定义身份过滤类

写json登录之前先看一下源码,了解一下它是如何表单登录的

在idea连按下shift键,搜索UsernamePasswordAuthenticationFilter类

进入后再按Ctrl+F12可以查看该类的所有方法

进入方法

我们只需要在request.getParameter()那里重写一下不就可以实现json登陆

重写attemptAuthentication(HttpServletRequestrequest,HttpServletResponseresponse)方法

只需要复制父类的方法,多加一个判断json的方法。就能同时支持key-value形式可json形式的参数了

public class MyAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
  @Override
  public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    if(!request.getMethod().equals("POST")){
      throw new AuthenticationServiceException("Authentication method not supported" + request.getMethod());
    }
    //说明是以json的形式传递参数
    if (request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) {
      String username = null;
      String password = null;
      //将传入的json数据转换成map再通过get("key")获得
      try {
        Map<String,String> map =new ObjectMapper().readValue(request.getInputStream(),
            Map.class);
        username = map.get("username");
        password = map.get("password");
      } catch (IOException e) {
        e.printStackTrace();
      }

      if (username == null) {

      }
      if (password == null) {

      }
      username = username.trim();
      UsernamePasswordAuthenticationToken authRequest =
          new UsernamePasswordAuthenticationToken(username, password);
      setDetails(request, authRequest);

      return this.getAuthenticationManager().authenticate(authRequest);
    }

    return super.attemptAuthentication(request, response);
  }
}

创建SecurityConfig配置类

注:自定义的过滤类和security原来那个表单登陆过滤设置是分开的

体现在filter.setFilterProcessesUrl()和loginProcessingUrl

因此表单登陆和json登陆的,successHandler判断也要分开写,

一会下面有效果图也可以印证这一点

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginProcessingUrl("/doLogin")
        .permitAll()
        .and()
        .csrf().disable();
    //将自定义的过滤器加进来,第二参数表示加到usernamePasswordAuthenticationFilter所在的位置
    http.addFilterAt(myAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
  }

  @Bean
  MyAuthenticationFilter myAuthenticationFilter() throws Exception{
    MyAuthenticationFilter filter = new MyAuthenticationFilter();
    filter.setAuthenticationManager(authenticationManagerBean());
    return filter;

  }
}

创建Controller

@RestController
public class HelloController {
  @GetMapping("/hello")
  public String hello(){
    return "hello security";
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java聊天室之实现使用Socket传递音频

    Java聊天室之实现使用Socket传递音频

    这篇文章主要为大家详细介绍了Java简易聊天室之使用Socket实现传递音频功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • Java实现贪吃蛇游戏源码

    Java实现贪吃蛇游戏源码

    这篇文章主要为大家详细介绍了Java实现贪吃蛇游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Java执行hadoop的基本操作实例代码

    Java执行hadoop的基本操作实例代码

    这篇文章主要介绍了Java执行hadoop的基本操作实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • 将java中的 string 类型转成 数组案例

    将java中的 string 类型转成 数组案例

    这篇文章主要介绍了将java中的 string 类型转成 数组案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java设计模式之抽象工厂模式详解

    Java设计模式之抽象工厂模式详解

    这篇文章主要介绍了Java设计模式之抽象工厂模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java指定保留小数位数的方法

    Java指定保留小数位数的方法

    本篇文章主要介绍了Java指定保留小数位数的方法,很多时候需要规定保留的小数位数,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • springboot中restful风格请求的使用方法示例

    springboot中restful风格请求的使用方法示例

    RESTful是一种web软件风格,它不是标准也不是协议,它不一定要采用,只是一种风格,它倡导的是一个资源定位(url)及资源操作的风格,下面这篇文章主要给大家介绍了关于springboot中restful风格请求的使用方法,需要的朋友可以参考下
    2023-02-02
  • Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?今天小编通过本教程给大家介绍下
    2016-12-12
  • SpringBoot启动指定profile的多种方式

    SpringBoot启动指定profile的多种方式

    这篇文章主要介绍了SpringBoot启动指定profile的多种方式,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 举例详解用Java实现web分页功能的方法

    举例详解用Java实现web分页功能的方法

    这篇文章主要介绍了举例详解用Java实现web分页功能的方法,这种基本功能现一般通过Hibernate框架来完成,需要的朋友可以参考下
    2015-10-10

最新评论