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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring security自定義用戶認(rèn)證流程詳解

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

1.自定義登錄頁(yè)面

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

  注意:springboot項(xiàng)目默認(rèn)可以訪問(wèn)resources/resources,resources/staic,resources/public目錄下面的靜態(tài)文件

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>登錄頁(yè)面</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()// 指定自定義登錄頁(yè)面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').and().authorizeRequests()// 添加一個(gè)url匹配器,如果匹配到login.html,就授權(quán).antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關(guān)閉spring security默認(rèn)的防csrf攻擊.csrf().disable(); }

(3)測(cè)試

(4)存在的問(wèn)題

<1>作為可以復(fù)用的登錄模塊,我們應(yīng)該提供個(gè)性化的登錄頁(yè)面,也就是說(shuō)不能寫死只跳轉(zhuǎn)到login.html。

此問(wèn)題比較好解決,使用可配置的登錄頁(yè)面,默認(rèn)使用login.html即可。

<2> 請(qǐng)求跳轉(zhuǎn)到login.html登錄頁(yè)面,貌似沒(méi)有什么問(wèn)題,但作為restful風(fēng)格的接口,一般響應(yīng)的都是json數(shù)據(jù)格式,尤其是app請(qǐng)求。

解決思想:用戶發(fā)起數(shù)據(jù)請(qǐng)求 --> security判斷是否需要身份認(rèn)證 ----->跳轉(zhuǎn)到一個(gè)自定義的controller方法 ------>在該方法內(nèi)判斷是否是html發(fā)起的請(qǐng)求,如果是,就跳轉(zhuǎn)到login.html,如果不是,響應(yīng)一個(gè)json格式的數(shù)據(jù),說(shuō)明錯(cuò)誤信息。

自定義Controller

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

spring security給該controller的login方法授權(quán)

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

這樣子就行了!!! 

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

(1)實(shí)現(xiàn)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()// 先進(jìn)controller中去.loginPage('/user/auth')// 指定自定義登錄頁(yè)面.loginPage('/login.html')// 登錄url.loginProcessingUrl('/auth/login').successHandler(myAuthenticationSuccessHandler).and().authorizeRequests()// 該controller需要授權(quán).antMatchers('/user/auth').permitAll()// 添加一個(gè)url匹配器,如果匹配到login.html,就授權(quán).antMatchers('/login.html').permitAll().anyRequest().authenticated().and()// 關(guān)閉spring security默認(rèn)的防csrf攻擊.csrf().disable(); }

(3)測(cè)試

Spring security自定義用戶認(rèn)證流程詳解

說(shuō)明:authentication對(duì)象中包含的信息,會(huì)因?yàn)榈卿浄绞降牟煌l(fā)生改變

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

實(shí)現(xiàn)AuthenticationFailureHandler.java接口即可,跟登錄成敗處理配置一樣。

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

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

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

/** * SavedRequestAwareAuthenticationSuccessHandler spring security 默認(rèn)的成功處理器 */@Slf4j@Componentpublic class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Autowired private ObjectMapper objectMapper; /** * 配置的登錄方式 */// @Value('${xxx:默認(rèn)方式}') 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數(shù)據(jù) if ('JSON'.equals(loginType)) { // 將登錄成功的信息寫到前端 response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write(objectMapper.writeValueAsString(authentication)); } else { // 否則就使用默認(rèn)的跳轉(zhuǎn)方式 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:默認(rèn)方式}') private String loginType = 'JSON'; @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { log.info('登錄失敗!!!'); // 如果配置的登錄方式是JSON,就返回json數(shù)據(jù) if ('JSON'.equals(loginType)) { // 將登錄成功的信息寫到前端 response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write(objectMapper.writeValueAsString(exception)); } else { // 否則就使用默認(rèn)的跳轉(zhuǎn)方式,跳轉(zhuǎn)到一個(gè)錯(cuò)誤頁(yè)面 super.onAuthenticationFailure(request,response,exception); } }}

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲综合激情在线| 首页国产欧美久久| 欧美偷窥清纯综合图区| 伊人精品在线| 国产精品毛片| 在线精品一区二区| 亚洲啊v在线免费视频| 免费观看在线综合| 婷婷视频一区二区三区| 久久国产视频网| 精品国产aⅴ| 久久99影视| 91av亚洲| 日韩一区二区免费看| 中文精品电影| 国产欧美日韩精品高清二区综合区| 久久国内精品自在自线400部| 久久精品色播| av资源亚洲| 伊人久久成人| 日韩高清不卡一区二区| 久久精品一本| 欧洲激情综合| 美女国产一区| 夜久久久久久| 日本成人在线视频网站| 日本成人中文字幕在线视频| 欧美精品导航| 久久都是精品| 狠狠操综合网| 国产精品1区| 色黄视频在线观看| 久久亚洲不卡| 久久中文字幕一区二区三区| 卡一精品卡二卡三网站乱码| 久久婷婷激情| 日本中文字幕不卡| 92国产精品| 日韩激情中文字幕| 日韩在线不卡| 日韩一区中文| 麻豆一区二区三| 欧美特黄a级高清免费大片a级| 亚洲精品影视| 中文在线免费视频| 国产午夜久久| 精品国产欧美| 蜜桃一区二区三区在线观看| 国语精品一区| 蜜桃一区二区三区在线| 日韩综合一区| 亚洲制服欧美另类| 精品国产美女a久久9999| 一本一本久久| 国内精品伊人| 国产亚洲在线| 麻豆国产精品777777在线| 激情婷婷综合| 免费在线播放第一区高清av| 国产视频一区三区| 国内不卡的一区二区三区中文字幕| 麻豆精品91| 桃色av一区二区| 亚欧成人精品| 99成人在线视频| 美女久久久精品| 亚洲性视频在线| 日韩精品免费一区二区在线观看| 欧美精品三级在线| 国产农村妇女精品一二区| 精品一级视频| 亚洲少妇一区| 91精品xxx在线观看| 久久激情五月婷婷| 美女久久一区| 日韩精品一区二区三区免费观看| 国产亚洲观看| 日韩在线一二三区| 久久中文字幕av| 久久亚洲人体| 日韩不卡一区二区三区| 99re国产精品| 久久影院一区| 婷婷激情一区| 精品国产不卡一区二区| 国产麻豆一区| 麻豆9191精品国产| 激情视频一区二区三区| 激情综合婷婷| 精品亚洲自拍| 麻豆精品一区二区综合av| 日本aⅴ亚洲精品中文乱码| 蜜桃久久久久久久| 欧美另类专区| 欧美日韩高清| 999国产精品永久免费视频app| а√天堂中文在线资源8| 欧美黄色一区| 久久99青青| 美腿丝袜亚洲三区| 美女视频黄 久久| 欧美一区=区三区| 日本不卡高清| 日韩高清二区| 日本电影久久久| 亚洲aa在线| 日本在线一区二区三区| 日韩精品成人在线观看| 日本成人手机在线| 91av一区| 国产精品主播在线观看| 69堂免费精品视频在线播放| 日韩av影院| 日韩在线麻豆| 日本综合精品一区| 日本欧美大码aⅴ在线播放| 日韩精品一二三| 香蕉视频成人在线观看| 9色国产精品| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产一区观看| 色88888久久久久久影院| 国产一区二区三区精品在线观看| 国产激情一区| 精品国产鲁一鲁****| 另类综合日韩欧美亚洲| 成人在线免费观看网站| 91日韩欧美| 日本一二区不卡| 日本а中文在线天堂| 激情久久中文字幕| 视频在线在亚洲| 日韩av一二三| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产极品一区| 久久av资源| av在线资源| 在线精品小视频| 免费在线观看日韩欧美| 三级欧美在线一区| 欧美日韩在线精品一区二区三区激情综合 | 久久国产中文字幕| 91成人精品| 亚洲三级视频| 国产精品玖玖玖在线资源| 精品国产乱码久久久久久1区2匹| 欧美成人精品三级网站| 先锋影音久久久| 欧美啪啪一区| 国内精品美女在线观看| 亚洲va在线| 蜜桃av一区二区在线观看| 国产欧美一区二区三区米奇| 日本久久精品| 久久精品一区二区不卡| 亚洲欧美日韩国产综合精品二区| 日本不卡视频在线| а√天堂8资源在线| 亚洲一区二区免费看| 日本午夜精品| 日韩欧美二区| 亚洲午夜免费| 你懂的国产精品| 欧美成人精品| 日韩av资源网| 中文字幕在线看片| 三级一区在线视频先锋| 欧美国产三级| 欧美福利在线| 日韩区欧美区| 正在播放日韩精品| 国产精品视区| 麻豆国产一区| 99在线|亚洲一区二区| 国产精品一区二区三区四区在线观看| 中文字幕高清在线播放| 免费久久99精品国产| 国内精品亚洲| 亚洲精品裸体| 欧美日韩国产观看视频| 亚洲一区导航| 欧美sm一区| 日韩va欧美va亚洲va久久| 91精品一区二区三区综合在线爱| 亚洲一级淫片| 国产精品yjizz视频网| 免费观看在线色综合| 国产高潮在线| 日产欧产美韩系列久久99| 欧美日韩一二| 久久影视三级福利片| 蜜臀av在线播放一区二区三区| 国产激情在线播放| 亚洲三级精品| 欧美日中文字幕| 国产精品v亚洲精品v日韩精品| 日韩午夜av| 麻豆成全视频免费观看在线看| 日韩精品中文字幕一区二区| 亚洲成人二区|