日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring security自定義用戶認證流程詳解

瀏覽:153日期:2023-09-16 18:44:46

1.自定義登錄頁面

(1)首先在static目錄下面創建login.html

  注意:springboot項目默認可以訪問resources/resources,resources/staic,resources/public目錄下面的靜態文件

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>登錄頁面</title></head><body><form action='/auth/login' method='post'> 用戶名:<input type='text' name='username'> <br/> 密&emsp;碼:<input type='password' name='password'> <br/> <input type='submit' value='登錄'></form></body></html>

(2)在spring securiy配置類中做如下配置

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin()// 指定自定義登錄頁面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').and().authorizeRequests()// 添加一個url匹配器,如果匹配到login.html,就授權.antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關閉spring security默認的防csrf攻擊.csrf().disable(); }

(3)測試

(4)存在的問題

<1>作為可以復用的登錄模塊,我們應該提供個性化的登錄頁面,也就是說不能寫死只跳轉到login.html。

此問題比較好解決,使用可配置的登錄頁面,默認使用login.html即可。

<2> 請求跳轉到login.html登錄頁面,貌似沒有什么問題,但作為restful風格的接口,一般響應的都是json數據格式,尤其是app請求。

解決思想:用戶發起數據請求 --> security判斷是否需要身份認證 ----->跳轉到一個自定義的controller方法 ------>在該方法內判斷是否是html發起的請求,如果是,就跳轉到login.html,如果不是,響應一個json格式的數據,說明錯誤信息。

自定義Controller

@Slf4j@RestControllerpublic class LoginController { /** * 請求緩存 */ private RequestCache requestCache = new HttpSessionRequestCache(); /** * 重定向工具類 */ private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); /** * 如果配置的登錄頁就使用配置的登錄面,否則使用默認的登錄頁面 */// @Value('${xxxx:defaultLoginPage}')// private String standardLoginPage; private String standardLoginPage = '/login.html'; // 登錄頁 /** * 用戶身份認證方法 */ @GetMapping('/user/auth') @ResponseStatus(code = HttpStatus.UNAUTHORIZED) // 返回狀態 public ResponseData login(HttpServletRequest request, HttpServletResponse response) throws IOException { SavedRequest savedRequest = requestCache.getRequest(request, response); if (savedRequest != null) { String targetUrl = savedRequest.getRedirectUrl(); log.info('請求是:' + targetUrl); // 如果請求是以html結尾 if (StringUtils.endsWithIgnoreCase(targetUrl, '.html')) {redirectStrategy.sendRedirect(request, response, standardLoginPage); } } return new ResponseData('該請求需要登錄,js拿到我的響應數據后,是否需要跳轉到登錄頁面你自己看著辦吧?'); }}

spring security給該controller的login方法授權

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin()// 先進controller中去.loginPage('/user/auth')// 指定自定義登錄頁面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').and().authorizeRequests()// 該controller需要授權.antMatchers('/user/auth').permitAll()// 添加一個url匹配器,如果匹配到login.html,就授權.antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關閉spring security默認的防csrf攻擊.csrf().disable(); }

這樣子就行了!!! 

2. 自定義登錄成功處理(返回json)

(1)實現AuthenticationSuccessHandler.java

import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.MediaType;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.AuthenticationSuccessHandler;import org.springframework.stereotype.Component;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@Slf4j@Componentpublic class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Autowired private ObjectMapper objectMapper; /** * Called when a user has been successfully authenticated. * @param request * @param response * @param authentication * @throws IOException * @throws ServletException */ @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { log.info('登錄成功!!!'); // 將登錄成功的信息寫到前端 response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write(objectMapper.writeValueAsString(authentication)); }}

(2)修改security配置類

@Autowired private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler; @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin()// 先進controller中去.loginPage('/user/auth')// 指定自定義登錄頁面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').successHandler(myAuthenticationSuccessHandler).and().authorizeRequests()// 該controller需要授權.antMatchers('/user/auth').permitAll()// 添加一個url匹配器,如果匹配到login.html,就授權.antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關閉spring security默認的防csrf攻擊.csrf().disable(); }

(3)測試

Spring security自定義用戶認證流程詳解

說明:authentication對象中包含的信息,會因為登錄方式的不同而發生改變

3.自定義登錄失敗處理(返回json)

實現AuthenticationFailureHandler.java接口即可,跟登錄成敗處理配置一樣。

4.自定義登錄成功處理邏輯

 以上的登錄成功或失敗的返回的都是json,但是在某些情況下,就是存在著登錄成功或者失敗進行頁面跳轉(spring security默認的處理方式),那么這種返回json的方式就不合適了。所以,我們應該做得更靈活,做成可配置的。

 對于登錄成功邏輯而言只需要對MyAuthenticationSuccessHandler.java稍做修改就行,代碼如下所示:

/** * SavedRequestAwareAuthenticationSuccessHandler spring security 默認的成功處理器 */@Slf4j@Componentpublic class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Autowired private ObjectMapper objectMapper; /** * 配置的登錄方式 */// @Value('${xxx:默認方式}') private String loginType = 'JSON'; /** * Called when a user has been successfully authenticated. */ @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { log.info('登錄成功!!!'); // 如果配置的登錄方式是JSON,就返回json數據 if ('JSON'.equals(loginType)) { // 將登錄成功的信息寫到前端 response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write(objectMapper.writeValueAsString(authentication)); } else { // 否則就使用默認的跳轉方式 super.onAuthenticationSuccess(request,response,authentication); } }}

5.自定義登錄失敗處理邏輯

同登錄成功類似,具體代碼如下:

import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;import org.springframework.stereotype.Component;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@Slf4j@Componentpublic class MySimpleUrlAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { @Autowired private ObjectMapper objectMapper; /** * 配置的登錄方式 */// @Value('${xxx:默認方式}') private String loginType = 'JSON'; @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { log.info('登錄失敗!!!'); // 如果配置的登錄方式是JSON,就返回json數據 if ('JSON'.equals(loginType)) { // 將登錄成功的信息寫到前端 response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write(objectMapper.writeValueAsString(exception)); } else { // 否則就使用默認的跳轉方式,跳轉到一個錯誤頁面 super.onAuthenticationFailure(request,response,exception); } }}

@Autowired private MySimpleUrlAuthenticationFailureHandler mySimpleUrlAuthenticationFailureHandler; @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin()// 先進controller中去.loginPage('/user/auth')// 指定自定義登錄頁面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').successHandler(myAuthenticationSuccessHandler).failureHandler(mySimpleUrlAuthenticationFailureHandler).and().authorizeRequests()// 該controller需要授權.antMatchers('/user/auth').permitAll()// 添加一個url匹配器,如果匹配到login.html,就授權.antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關閉spring security默認的防csrf攻擊.csrf().disable(); }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩在线观看不卡| 亚洲三级网站| 不卡在线一区二区| 日本久久一区| 久久久久久久欧美精品| 亚洲一区日韩在线| 麻豆久久一区| 五月亚洲婷婷 | 日本久久二区| 国际精品欧美精品| 久久精品影视| 综合一区在线| 欧美激情日韩| 久久久久久久久久久9不雅视频| 久久婷婷激情| 日韩一区二区三免费高清在线观看| 亚洲精一区二区三区| 欧美亚洲一区二区三区| 精品一区二区三区中文字幕在线| 樱桃视频成人在线观看| 一区二区亚洲视频| 久久久久黄色| 日韩黄色大片网站| 亚洲一区二区小说| 日韩有吗在线观看| 亚洲人成精品久久久| 国产香蕉精品| 亚洲专区视频| 一区二区精彩视频| 亚洲精品黄色| 久久国产66| 伊人久久在线| 欧美性感美女一区二区| 欧产日产国产精品视频| 综合日韩av| 伊人影院久久| 日韩一区二区三区高清在线观看 | 免费一二一二在线视频| 亚洲精品中文字幕乱码| 性欧美长视频| 欧美不卡高清| 一级欧洲+日本+国产| 麻豆国产精品777777在线| 国产精品2区| 激情91久久| 久久精品 人人爱| 久久国产成人午夜av影院宅| 欧美午夜精品一区二区三区电影| 国产精品精品| 精品国产乱码| 欧美在线影院| 91成人在线| 精品久久久中文字幕| 久久中文字幕av一区二区不卡| 石原莉奈在线亚洲二区| 欧美另类中文字幕 | 欧美特黄一区| 亚洲开心激情| 国产成人久久精品麻豆二区| 红桃视频国产一区| 国产精品嫩模av在线| 日本不卡免费高清视频在线| 99riav1国产精品视频| 国产精品videossex久久发布| 国产精品av一区二区| 日本va欧美va精品发布| 久久精品二区三区| 欧美日韩伊人| 亚洲欧洲一区二区天堂久久| 国产精品玖玖玖在线资源| 激情婷婷欧美| 国产在线一区不卡| 欧美精品自拍| 麻豆91在线播放| 亚洲一区二区三区久久久| 国产精品久久观看| 午夜天堂精品久久久久| 99久精品视频在线观看视频| 欧美亚洲免费| 婷婷激情图片久久| 精品亚洲二区| 亚洲精品国产精品粉嫩| 人在线成免费视频| 91成人在线| 妖精视频成人观看www| 麻豆理论在线观看| 国产日韩高清一区二区三区在线 | 视频在线不卡免费观看| 中文字幕日本一区| 久久精品99久久无色码中文字幕| 国产乱论精品| 免费的成人av| 久久美女精品| 精品三级国产| 日韩激情视频网站| 国产一区日韩一区| 久久精品亚洲| 日韩av中文字幕一区二区| 久久网站免费观看| 精品国产精品久久一区免费式| 午夜精品影视国产一区在线麻豆| 久久蜜桃av| 日韩精品永久网址| 精品一区二区三区免费看| 午夜亚洲福利| 亚洲欧美日韩精品一区二区| 99久久精品国产亚洲精品| 精品成av人一区二区三区| 国产视频网站一区二区三区| 丝瓜av网站精品一区二区| 在线人成日本视频| 久久久国产精品网站| 日本v片在线高清不卡在线观看| 亚洲免费高清| 国产综合色产| 久久久精品久久久久久96| 日韩中文影院| 亚洲天堂一区二区| 国产一区二区三区黄网站| 国产精品igao视频网网址不卡日韩 | 亚洲精品黄色| 亚洲欧洲一区二区天堂久久| 香蕉成人av| 日本久久成人网| 亚洲www免费| 亚洲91精品| 亚洲精品中文字幕乱码| 精品一区在线| 久久都是精品| 日韩一区精品视频| 伊人国产精品| 日韩精品午夜视频| 日韩**一区毛片| 欧美日韩网址| 国产精品香蕉| 美女视频免费精品| 国产精品入口久久| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日本不卡视频在线观看| 日本精品国产| 久久99精品久久久野外观看| 欧美a级一区二区| 丰满少妇一区| 日韩精品免费一区二区三区| 欧美日韩中文一区二区| 狠狠干综合网| 日韩精品高清不卡| 里番精品3d一二三区| 久久精品国产久精国产| 丁香婷婷久久| 国产亚洲一区二区手机在线观看| 999国产精品永久免费视频app| 国内精品福利| 免费在线观看成人| 日韩欧美四区| 欧美激情99| www在线观看黄色| 五月天综合网站| 日韩精品亚洲专区| 国产成人精品福利| 精品中文一区| 91成人精品在线| 国产一区日韩| 久久国产直播| 中文一区一区三区免费在线观 | 久久99国产精品视频| 国产盗摄——sm在线视频| 99视频在线精品国自产拍免费观看| 在线看片日韩| 欧美日韩视频免费观看| 97精品资源在线观看| 免费成人性网站| 国产99久久| 免费国产自久久久久三四区久久| 欧美日韩国产免费观看| 免费国产亚洲视频| 国产欧美日韩一区二区三区四区 | 性欧美精品高清| 久久精品72免费观看| 亚洲www啪成人一区二区| 亚洲最大av| 国产传媒在线观看| 亚洲理论在线| 一本大道色婷婷在线| 亚洲精品一级| 动漫av一区| 亚洲免费专区| 日本欧美不卡| 久久精品999| 怡红院精品视频在线观看极品| 国产精品香蕉| 亚洲在线成人| 高清一区二区三区| 亚洲视频二区| 日韩在线不卡| 91精品尤物| 一区二区自拍| 精品精品99| 日韩中文字幕| 日韩精品永久网址|