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

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

Spring security 自定義過濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實(shí)例代碼)

瀏覽:178日期:2023-07-25 09:43:00

依賴

<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> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>配置安全適配類

基本配置和配置自定義過濾器

package com.study.auth.config.core; import com.study.auth.config.core.authentication.AccountAuthenticationProvider;import com.study.auth.config.core.authentication.MailAuthenticationProvider;import com.study.auth.config.core.authentication.PhoneAuthenticationProvider;import com.study.auth.config.core.filter.CustomerUsernamePasswordAuthenticationFilter;import com.study.auth.config.core.handler.CustomerAuthenticationFailureHandler;import com.study.auth.config.core.handler.CustomerAuthenticationSuccessHandler;import com.study.auth.config.core.handler.CustomerLogoutSuccessHandler;import com.study.auth.config.core.observer.CustomerUserDetailsService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.builders.WebSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; /** * @Package: com.study.auth.config * @Description: <> * @Author: milla * @CreateDate: 2020/09/04 11:27 * @UpdateUser: milla * @UpdateDate: 2020/09/04 11:27 * @UpdateRemark: <> * @Version: 1.0 */@Slf4j@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private AccountAuthenticationProvider provider; @Autowired private MailAuthenticationProvider mailProvider; @Autowired private PhoneAuthenticationProvider phoneProvider; @Autowired private CustomerUserDetailsService userDetailsService; @Autowired private CustomerAuthenticationSuccessHandler successHandler; @Autowired private CustomerAuthenticationFailureHandler failureHandler; @Autowired private CustomerLogoutSuccessHandler logoutSuccessHandler; /** * 配置攔截器保護(hù)請求 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { //配置HTTP基本身份驗(yàn)證//使用自定義過濾器-兼容json和表單登錄 http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class).httpBasic().and().authorizeRequests()//表示訪問 /setting 這個(gè)接口,需要具備 admin 這個(gè)角色.antMatchers('/setting').hasRole('admin')//表示剩余的其他接口,登錄之后就能訪問.anyRequest().authenticated().and().formLogin()//定義登錄頁面,未登錄時(shí),訪問一個(gè)需要登錄之后才能訪問的接口,會自動跳轉(zhuǎn)到該頁面.loginPage('/noToken')//登錄處理接口-登錄時(shí)候訪問的接口地址.loginProcessingUrl('/account/login')//定義登錄時(shí),表單中用戶名的 key,默認(rèn)為 username.usernameParameter('username')//定義登錄時(shí),表單中用戶密碼的 key,默認(rèn)為 password.passwordParameter('password')////登錄成功的處理器//.successHandler(successHandler)////登錄失敗的處理器//.failureHandler(failureHandler)//允許所有用戶訪問.permitAll().and().logout().logoutUrl('/logout')//登出成功的處理.logoutSuccessHandler(logoutSuccessHandler).permitAll(); //關(guān)閉csrf跨域攻擊防御 http.csrf().disable(); } /** * 配置權(quán)限認(rèn)證服務(wù) * * @param auth * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //權(quán)限校驗(yàn)-只要有一個(gè)認(rèn)證通過即認(rèn)為是通過的(有一個(gè)認(rèn)證通過就跳出認(rèn)證循環(huán))-適用于多登錄方式的系統(tǒng)// auth.authenticationProvider(provider);// auth.authenticationProvider(mailProvider);// auth.authenticationProvider(phoneProvider); //直接使用userDetailsService auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); } /** * 配置Spring Security的Filter鏈 * * @param web * @throws Exception */ @Override public void configure(WebSecurity web) throws Exception { //忽略攔截的接口 web.ignoring().antMatchers('/noToken'); } /** * 指定驗(yàn)證manager * * @return * @throws Exception */ @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } /** * 注冊自定義的UsernamePasswordAuthenticationFilter * * @return * @throws Exception */ @Bean public AbstractAuthenticationProcessingFilter customAuthenticationFilter() throws Exception { AbstractAuthenticationProcessingFilter filter = new CustomerUsernamePasswordAuthenticationFilter(); filter.setAuthenticationSuccessHandler(successHandler); filter.setAuthenticationFailureHandler(failureHandler); //過濾器攔截的url要和登錄的url一致,否則不生效 filter.setFilterProcessesUrl('/account/login'); //這句很關(guān)鍵,重用WebSecurityConfigurerAdapter配置的AuthenticationManager,不然要自己組裝AuthenticationManager filter.setAuthenticationManager(authenticationManagerBean()); return filter; }}自定義過濾器

根據(jù)ContentType是否為json進(jìn)行判斷,如果是就從body中讀取參數(shù),進(jìn)行解析,并生成權(quán)限實(shí)體,進(jìn)行權(quán)限認(rèn)證

否則直接使用UsernamePasswordAuthenticationFilter中的方法

package com.study.auth.config.core.filter; import com.fasterxml.jackson.databind.ObjectMapper;import com.study.auth.config.core.util.AuthenticationStoreUtil;import com.study.auth.entity.bo.LoginBO;import lombok.extern.slf4j.Slf4j;import org.springframework.http.MediaType;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream; /** * @Package: com.study.auth.config.core.filter * @Description: <> * @Author: milla * @CreateDate: 2020/09/11 16:04 * @UpdateUser: milla * @UpdateDate: 2020/09/11 16:04 * @UpdateRemark: <> * @Version: 1.0 */@Slf4jpublic class CustomerUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { /** * 空字符串 */ private final String EMPTY = ''; @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { //如果不是json使用自帶的過濾器獲取參數(shù) if (!request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE) && !request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) { String username = this.obtainUsername(request); String password = this.obtainPassword(request); storeAuthentication(username, password); Authentication authentication = super.attemptAuthentication(request, response); return authentication; } //如果是json請求使用取參數(shù)邏輯 ObjectMapper mapper = new ObjectMapper(); UsernamePasswordAuthenticationToken authRequest = null; try (InputStream is = request.getInputStream()) { LoginBO account = mapper.readValue(is, LoginBO.class); storeAuthentication(account.getUsername(), account.getPassword()); authRequest = new UsernamePasswordAuthenticationToken(account.getUsername(), account.getPassword()); } catch (IOException e) { log.error('驗(yàn)證失?。簕}', e); authRequest = new UsernamePasswordAuthenticationToken(EMPTY, EMPTY); } finally { setDetails(request, authRequest); Authentication authenticate = this.getAuthenticationManager().authenticate(authRequest); return authenticate; } } /** * 保存用戶名和密碼 * * @param username 帳號/郵箱/手機(jī)號 * @param password 密碼/驗(yàn)證碼 */ private void storeAuthentication(String username, String password) { AuthenticationStoreUtil.setUsername(username); AuthenticationStoreUtil.setPassword(password); }}

其中會有body中的傳參問題,所以使用ThreadLocal傳遞參數(shù)

PS:枚舉類具備線程安全性

package com.study.auth.config.core.util; /** * @Package: com.study.auth.config.core.util * @Description: <使用枚舉可以保證線程安全> * @Author: milla * @CreateDate: 2020/09/11 17:48 * @UpdateUser: milla * @UpdateDate: 2020/09/11 17:48 * @UpdateRemark: <> * @Version: 1.0 */public enum AuthenticationStoreUtil { AUTHENTICATION; /** * 登錄認(rèn)證之后的token */ private final ThreadLocal<String> tokenStore = new ThreadLocal<>(); /** * 需要驗(yàn)證用戶名 */ private final ThreadLocal<String> usernameStore = new ThreadLocal<>(); /** * 需要驗(yàn)證的密碼 */ private final ThreadLocal<String> passwordStore = new ThreadLocal<>(); public static String getUsername() { return AUTHENTICATION.usernameStore.get(); } public static void setUsername(String username) { AUTHENTICATION.usernameStore.set(username); } public static String getPassword() { return AUTHENTICATION.passwordStore.get(); } public static void setPassword(String password) { AUTHENTICATION.passwordStore.set(password); } public static String getToken() { return AUTHENTICATION.tokenStore.get(); } public static void setToken(String token) { AUTHENTICATION.tokenStore.set(token); } public static void clear() { AUTHENTICATION.tokenStore.remove(); AUTHENTICATION.passwordStore.remove(); AUTHENTICATION.usernameStore.remove(); }}實(shí)現(xiàn)UserDetailsService接口

package com.study.auth.config.core.observer; import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.password.PasswordEncoder;import org.springframework.stereotype.Component; /** * @Package: com.study.auth.config.core * @Description: <自定義用戶處理類> * @Author: milla * @CreateDate: 2020/09/04 13:53 * @UpdateUser: milla * @UpdateDate: 2020/09/04 13:53 * @UpdateRemark: <> * @Version: 1.0 */@Slf4j@Componentpublic class CustomerUserDetailsService implements UserDetailsService { @Autowired private PasswordEncoder passwordEncoder; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //測試直接使用固定賬戶代替 return User.withUsername('admin').password(passwordEncoder.encode('admin')).roles('admin', 'user').build(); }} 登錄成功類

package com.study.auth.config.core.handler; 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; /** * @Package: com.study.auth.config.core.handler * @Description: <登錄成功處理類> * @Author: milla * @CreateDate: 2020/09/08 17:39 * @UpdateUser: milla * @UpdateDate: 2020/09/08 17:39 * @UpdateRemark: <> * @Version: 1.0 */@Componentpublic class CustomerAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { HttpServletResponseUtil.loginSuccess(response); }} 登錄失敗

package com.study.auth.config.core.handler; import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.AuthenticationFailureHandler;import org.springframework.stereotype.Component; import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException; /** * @Package: com.study.auth.config.core.handler * @Description: <登錄失敗操作類> * @Author: milla * @CreateDate: 2020/09/08 17:42 * @UpdateUser: milla * @UpdateDate: 2020/09/08 17:42 * @UpdateRemark: <> * @Version: 1.0 */@Componentpublic class CustomerAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { HttpServletResponseUtil.loginFailure(response, exception); }} 登出成功類

package com.study.auth.config.core.handler; import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;import org.springframework.stereotype.Component; import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException; /** * @Package: com.study.auth.config.core.handler * @Description: <登出成功> * @Author: milla * @CreateDate: 2020/09/08 17:44 * @UpdateUser: milla * @UpdateDate: 2020/09/08 17:44 * @UpdateRemark: <> * @Version: 1.0 */@Componentpublic class CustomerLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { HttpServletResponseUtil.logoutSuccess(response); }}返回值工具類

package com.study.auth.config.core.handler; import com.alibaba.fastjson.JSON;import com.study.auth.comm.ResponseData;import com.study.auth.constant.CommonConstant;import org.springframework.http.MediaType;import org.springframework.security.core.AuthenticationException; import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter; /** * @Package: com.study.auth.config.core.handler * @Description: <> * @Author: milla * @CreateDate: 2020/09/08 17:45 * @UpdateUser: milla * @UpdateDate: 2020/09/08 17:45 * @UpdateRemark: <> * @Version: 1.0 */public final class HttpServletResponseUtil { public static void loginSuccess(HttpServletResponse resp) throws IOException { ResponseData success = ResponseData.success(); success.setMsg('login success'); response(resp, success); } public static void logoutSuccess(HttpServletResponse resp) throws IOException { ResponseData success = ResponseData.success(); success.setMsg('logout success'); response(resp, success); } public static void loginFailure(HttpServletResponse resp, AuthenticationException exception) throws IOException { ResponseData failure = ResponseData.error(CommonConstant.EX_RUN_TIME_EXCEPTION, exception.getMessage()); response(resp, failure); } private static void response(HttpServletResponse resp, ResponseData data) throws IOException { //直接輸出的時(shí)候還是需要使用UTF-8字符集 resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); PrintWriter out = resp.getWriter(); out.write(JSON.toJSONString(data)); out.flush(); }}

其他對象見Controller 層返回值的公共包裝類-避免每次都包裝一次返回-InitializingBean增強(qiáng)

至此,就可以傳遞Json參數(shù)了

Spring security 自定義過濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實(shí)例代碼)

到此這篇關(guān)于Spring security 自定義過濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)的文章就介紹到這了,更多相關(guān)Spring security 自定義過濾器內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品少妇一区| 国产精品欧美在线观看| 亚洲精品影视| 99久久夜色精品国产亚洲狼| 欧美精品不卡| 欧美激情精品| 日韩a一区二区| 丝袜美腿一区| 午夜久久福利| 喷白浆一区二区| 亚洲精品观看| 国产精品亚洲产品| av资源亚洲| 另类中文字幕国产精品| 2023国产精品久久久精品双 | 亚洲青青久久| 青青草国产成人99久久| 国产日产高清欧美一区二区三区 | 91精品麻豆| 精品中文字幕一区二区三区| 涩涩av在线| 亚洲欧美日本国产专区一区| 日韩综合小视频| 国产精品自拍区| 91亚洲一区| 国产精品三上| 久久国产尿小便嘘嘘| 久久精品国产999大香线蕉 | 免费国产自久久久久三四区久久 | 精品中文字幕一区二区三区av| 香蕉精品999视频一区二区| 日韩av中文字幕一区二区| 国产91欧美| 国产伦精品一区二区三区在线播放| 老鸭窝毛片一区二区三区| 一级欧洲+日本+国产| 天堂va欧美ⅴa亚洲va一国产| 99精品在线观看| 中文在线а√在线8| 成人在线视频免费| 久久国产精品色av免费看| 日韩va欧美va亚洲va久久| 日本h片久久| 高清日韩欧美| 日韩午夜在线| 久久av免费看| 在线亚洲精品| 精品一区av| 乱人伦精品视频在线观看| 久久av国产紧身裤| 蜜桃成人av| 日韩成人精品一区二区三区| 欧洲一级精品| 国产九九精品| 国产偷自视频区视频一区二区| 欧美激情91| 免费国产亚洲视频| 免费看av不卡| 国产欧美88| 亚洲一卡久久| 精品伊人久久| 亚洲三级网站| 亚洲一级特黄| 欧美激情一区| 亚洲精品黄色| 欧美+日本+国产+在线a∨观看| 久久精品999| 国产精品外国| 日韩三区免费| 久久精品网址| 国产亚洲欧美日韩精品一区二区三区 | 亚洲一区国产| 樱桃视频成人在线观看| 日韩二区在线观看| 日韩一区二区久久| 国产欧洲在线| 国产精品玖玖玖在线资源| 天堂av在线一区| 999精品在线| 精品国产不卡一区二区| 久久狠狠亚洲综合| 亚洲毛片在线| 在线综合视频| xxxxx性欧美特大| 牛牛精品成人免费视频| 日韩久久99| 亚洲精品视频一二三区| 久久国产精品久久w女人spa| 欧美粗暴jizz性欧美20| 日韩久久电影| 国产成人精选| 久久久久伊人| 国产精品网在线观看| 日本中文字幕一区二区视频| 欧美专区18| 91久久中文| 午夜精品亚洲| 香蕉人人精品| 日韩1区2区| 国产在线日韩精品| 麻豆精品av| 精品一区二区三区中文字幕视频 | 欧美一级二级视频| 日韩欧美久久| 日韩国产一区二| 日本久久一区| 91九色综合| 国产欧美日韩一级| 久久精品凹凸全集| 国产日韩欧美三级| 国产午夜久久av| 国产日本精品| 日韩不卡免费视频| 777久久精品| 国产精品自在| 欧美激情亚洲| 国内精品伊人| 在线中文字幕播放| 蜜臀久久精品| 欧美不卡高清| 亚洲国产不卡| 亚洲欧美日韩在线观看a三区| 在线亚洲观看| 亚洲色图国产| 69堂精品视频在线播放| 国产精品亚洲综合久久| 美腿丝袜亚洲三区| 精品国产乱码久久久| 黑人精品一区| 九九综合九九| 亚洲日本欧美| 国产精品白浆| 电影亚洲精品噜噜在线观看| 99久久亚洲精品蜜臀| 在线亚洲免费| 日韩欧美中文字幕电影| 国产亚洲一卡2卡3卡4卡新区| 欧美国产精品| 成人羞羞视频播放网站| 婷婷丁香综合| 亚洲在线网站| 国产日韩欧美在线播放不卡| 免费一级欧美片在线观看网站| 日本а中文在线天堂| 亚洲女同中文字幕| 日韩欧美三区| 国产一区二区三区四区五区| 日韩在线不卡| 美女精品在线观看| 国产亚洲精aa在线看 | 精品精品99| 国产伊人精品| 中文字幕视频精品一区二区三区| 91成人在线网站| 国产精品久久久久蜜臀| 亚州av乱码久久精品蜜桃| 免费看日韩精品| 国产精品亚洲片在线播放| 福利一区在线| 99在线精品免费视频九九视| 日韩精品成人| 日韩精品永久网址| 免费日韩一区二区| 国产精品tv| 在线日韩一区| 国产欧美日韩在线观看视频 | re久久精品视频| 国产香蕉精品| 亚洲一级特黄| 欧美影院精品| 99精品视频在线| 欧美日本久久| 欧美+日本+国产+在线a∨观看| 欧美天堂一区二区| 欧美sss在线视频| 亚洲欧洲国产精品一区| 91日韩欧美| 亚洲精品欧洲| 欧美精品资源| 国产日韩一区二区三区在线| 久久国产影院| 国产亚洲欧美日韩在线观看一区二区 | 精品三级av| 午夜一区在线| 91亚洲一区| 日韩国产在线一| 国产精品av一区二区| 国产精品午夜一区二区三区| 亚洲精品a级片| 国产在线一区不卡| 日韩精品亚洲专区| 亚洲大片在线| 精品中文字幕一区二区三区四区| 国产一级久久| 裤袜国产欧美精品一区| 青青草91久久久久久久久| 欧洲激情综合| 成人污污视频| 日韩激情一二三区| 欧美特黄一区|