Spring Security基于json登錄實(shí)現(xiàn)過(guò)程詳解
主要是重寫(xiě)attemptAuthentication方法
導(dǎo)入依賴(lài)
<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>
相關(guān)配置和代碼
application.properties配置密碼
spring.security.user.name=admin
spring.security.user.password=123
創(chuàng)建自定義身份過(guò)濾類(lèi)
寫(xiě)json登錄之前先看一下源碼,了解一下它是如何表單登錄的
在idea連按下shift鍵,搜索UsernamePasswordAuthenticationFilter類(lèi)

進(jìn)入后再按Ctrl+F12可以查看該類(lèi)的所有方法

進(jìn)入方法

我們只需要在request.getParameter()那里重寫(xiě)一下不就可以實(shí)現(xiàn)json登陸
重寫(xiě)attemptAuthentication(HttpServletRequestrequest,HttpServletResponseresponse)方法
只需要復(fù)制父類(lèi)的方法,多加一個(gè)判斷json的方法。就能同時(shí)支持key-value形式可json形式的參數(shù)了

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());
}
//說(shuō)明是以json的形式傳遞參數(shù)
if (request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) {
String username = null;
String password = null;
//將傳入的json數(shù)據(jù)轉(zhuǎn)換成map再通過(guò)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);
}
}
創(chuàng)建SecurityConfig配置類(lèi)

注:自定義的過(guò)濾類(lèi)和security原來(lái)那個(gè)表單登陸過(guò)濾設(shè)置是分開(kāi)的
體現(xiàn)在filter.setFilterProcessesUrl()和loginProcessingUrl
因此表單登陸和json登陸的,successHandler判斷也要分開(kāi)寫(xiě),
一會(huì)下面有效果圖也可以印證這一點(diǎn)
@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();
//將自定義的過(guò)濾器加進(jìn)來(lái),第二參數(shù)表示加到usernamePasswordAuthenticationFilter所在的位置
http.addFilterAt(myAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Bean
MyAuthenticationFilter myAuthenticationFilter() throws Exception{
MyAuthenticationFilter filter = new MyAuthenticationFilter();
filter.setAuthenticationManager(authenticationManagerBean());
return filter;
}
}
創(chuàng)建Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello security";
}
}



以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java中List接口底層實(shí)現(xiàn)原理
Java是一種廣泛應(yīng)用的編程語(yǔ)言,被廣泛應(yīng)用于各種平臺(tái)和應(yīng)用領(lǐng)域,List接口是Java中最重要的數(shù)據(jù)結(jié)構(gòu)之一,它為我們提供了一種靈活、高效、可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),本篇文章將首先介紹Java中List接口的基本特性和使用方法,然后深入研究List接口的底層實(shí)現(xiàn)原理2023-11-11
SpringBoot整合RabbitMQ實(shí)現(xiàn)交換機(jī)與隊(duì)列的綁定
這篇文章將通過(guò)幾個(gè)實(shí)例為大家介紹一些SpringBoot中RabbitMQ如何綁定交換機(jī)(交換器)與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
Spring Data JPA中的動(dòng)態(tài)查詢(xún)實(shí)例
本篇文章主要介紹了詳解Spring Data JPA中的動(dòng)態(tài)查詢(xún)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
代理角色java設(shè)計(jì)模式之靜態(tài)代理詳細(xì)介紹
查了好多資料,發(fā)現(xiàn)還是不全,干脆自己整理吧,至少保證在我的做法正確的,以免誤導(dǎo)讀者,也是給自己做個(gè)記錄吧!2013-05-05
SpringBoot集成Redis的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot集成Redis的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
編程入門(mén):掌握J(rèn)ava運(yùn)算符技巧
掌握J(rèn)ava運(yùn)算符技巧,能讓你的編程之旅輕松許多,本指南將帶你深入了解如何巧妙地使用這些強(qiáng)大的工具,讓代碼不僅高效,還充滿樂(lè)趣,跟著我們一起,讓你的Java代碼在運(yùn)算符的魔法下煥發(fā)新生!2023-12-12
java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

