主要是重寫attemptAuthentication方法
導入依賴
1
2
3
4
5
6
7
8
|
< 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
創建自定義身份過濾類
在idea連按下shift鍵,搜索UsernamePasswordAuthenticationFilter類
進入后再按Ctrl+F12可以查看該類的所有方法
進入方法
我們只需要在request.getParameter()那里重寫一下不就可以實現json登陸
重寫attemptAuthentication(HttpServletRequestrequest,HttpServletResponseresponse)方法
只需要復制父類的方法,多加一個判斷json的方法。就能同時支持key-value形式可json形式的參數了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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判斷也要分開寫,
一會下面有效果圖也可以印證這一點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@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
1
2
3
4
5
6
7
|
@RestController public class HelloController { @GetMapping ( "/hello" ) public String hello(){ return "hello security" ; } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/qiuwenli/p/13447061.html