今天就跟大家聊聊有關springboot怎么以FTP方式上傳文件到遠程服務器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)是一家集網站建設,兗州企業(yè)網站建設,兗州品牌網站建設,網站定制,兗州網站建設報價,網絡營銷,網絡優(yōu)化,兗州網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。
通過筆者前兩篇文章的說明,相信大家已經知道JWT是什么,怎么用,該如何結合Spring Security使用。那么本節(jié)就用代碼來具體的實現(xiàn)一下JWT登錄認證及鑒權的流程。
一、環(huán)境準備工作
建立Spring Boot項目并集成了Spring Security,項目可以正常啟動
通過controller寫一個HTTP的GET方法服務接口,比如:“/hello”
實現(xiàn)最基本的動態(tài)數(shù)據(jù)驗證及權限分配,即實現(xiàn)UserDetailsService接口和UserDetails接口。這兩個接口都是向Spring Security提供用戶、角色、權限等校驗信息的接口
如果你學習過Spring Security的formLogin登錄模式,請將HttpSecurity配置中的formLogin()配置段全部去掉。因為JWT完全使用JSON接口,沒有from表單提交。
HttpSecurity配置中一定要加上csrf().disable()
,即暫時關掉跨站攻擊CSRF的防御。這樣是不安全的,我們后續(xù)章節(jié)再做處理。
以上的內容,我們在之前的文章中都已經講過。如果仍然不熟悉,可以翻看本號之前的文章。
## 二、開發(fā)JWT工具類
通過maven坐標引入JWT工具包jjwt
在application.yml中加入如下自定義一些關于JWT的配置
jwt: header: JWTHeaderName secret: aabbccdd expiration: 3600000
其中header是攜帶JWT令牌的HTTP的Header的名稱。雖然我這里叫做JWTHeaderName,但是在實際生產中可讀性越差越安全。
secret是用來為JWT基礎信息加密和解密的密鑰。雖然我在這里在配置文件寫死了,但是在實際生產中通常不直接寫在配置文件里面。而是通過應用的啟動參數(shù)傳遞,并且需要定期修改。
expiration是JWT令牌的有效時間。
寫一個Spring Boot配置自動加載的工具類。
@Data@ConfigurationProperties(prefix = "jwt") //配置自動加載,prefix是配置的前綴@Componentpublic class JwtTokenUtil implements Serializable { private String secret; private Long expiration; private String header; /** * 生成token令牌 * * @param userDetails 用戶 * @return 令token牌 */ public String generateToken(UserDetails userDetails) { Map
上面的代碼就是使用io.jsonwebtoken.jjwt提供的方法開發(fā)JWT令牌生成、刷新的工具類。
三、開發(fā)登錄接口(獲取Token的接口)
"/authentication"接口用于登錄驗證,并且生成JWT返回給客戶端"/REFRESHTOKEN"接口用于刷新JWT,更新JWT令牌的有效期@RESTCONTROLLERPUBLIC CLASS JWTAUTHCONTROLLER { @RESOURCE PRIVATE JWTAUTHSERVICE JWTAUTHSERVICE; @POSTMAPPING(VALUE = "/AUTHENTICATION") PUBLIC AJAXRESPONSE LOGIN(@REQUESTBODY MAP
核心的token業(yè)務邏輯寫在JwtAuthService 中
login方法中首先使用用戶名、密碼進行登錄驗證。如果驗證失敗拋出BadCredentialsException異常。如果驗證成功,程序繼續(xù)向下走,生成JWT響應給前端
refreshToken方法只有在JWT token沒有過期的情況下才能刷新,過期了就不能刷新了。需要重新登錄。
@Servicepublic class JwtAuthService { @Resource private AuthenticationManager authenticationManager; @Resource private UserDetailsService userDetailsService; @Resource private JwtTokenUtil jwtTokenUtil; public String login(String username, String password) { //使用用戶名密碼進行登錄驗證 UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken( username, password ); Authentication authentication = authenticationManager.authenticate(upToken); SecurityContextHolder.getContext().setAuthentication(authentication); //生成JWT UserDetails userDetails = userDetailsService.loadUserByUsername( username ); return jwtTokenUtil.generateToken(userDetails); } public String refreshToken(String oldToken) { if (!jwtTokenUtil.isTokenExpired(oldToken)) { return jwtTokenUtil.refreshToken(oldToken); } return null; }}
因為使用到了AuthenticationManager ,所以在繼承WebSecurityConfigurerAdapter的SpringSecurity配置實現(xiàn)類中,將AuthenticationManager 聲明為一個Bean。并將"/authentication"和 "/refreshtoken"開放訪問權限,如何開放訪問權限,我們之前的文章已經講過了。
@Bean(name = BeanIds.AUTHENTICATION_MANAGER)@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean();}
四、接口訪問鑒權過濾器
當用戶第一次登陸之后,我們將JWT令牌返回給了客戶端,客戶端應該將該令牌保存起來。在進行接口請求的時候,將令牌帶上,放到HTTP的header里面,header的名字要和jwt.header的配置一致,這樣服務端才能解析到。下面我們定義一個攔截器:
攔截接口請求,從請求request獲取token,從token中解析得到用戶名
然后通過UserDetailsService獲得系統(tǒng)用戶(從數(shù)據(jù)庫、或其他其存儲介質)
根據(jù)用戶信息和JWT令牌,驗證系統(tǒng)用戶與用戶輸入的一致性,并判斷JWT是否過期。如果沒有過期,至此表明了該用戶的確是該系統(tǒng)的用戶。
但是,你是系統(tǒng)用戶不代表你可以訪問所有的接口。所以需要構造UsernamePasswordAuthenticationToken傳遞用戶、權限信息,并將這些信息通過authentication告知Spring Security。Spring Security會以此判斷你的接口訪問權限。
@Slf4j@Componentpublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Resource private MyUserDetailsService userDetailsService; @Resource private JwtTokenUtil jwtTokenUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { // 從這里開始獲取 request 中的 jwt token String authHeader = request.getHeader(jwtTokenUtil.getHeader()); log.info("authHeader:{}", authHeader); // 驗證token是否存在 if (authHeader != null && StringUtils.isNotEmpty(authHeader)) { // 根據(jù)token 獲取用戶名 String username = jwtTokenUtil.getUsernameFromToken(authHeader); if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { // 通過用戶名 獲取用戶的信息 UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); // 驗證JWT是否過期 if (jwtTokenUtil.validateToken(authHeader, userDetails)) { //加載用戶、角色、權限信息,Spring Security根據(jù)這些信息判斷接口的訪問權限 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource() .buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } } } chain.doFilter(request, response); }}
在spring Security的配置類(即WebSecurityConfigurerAdapter實現(xiàn)類的configure(HttpSecurity http)配置方法中,加入如下配置:
.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and().addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
因為我們使用了JWT,表明了我們的應用是一個前后端分離的應用,所以我們可以開啟STATELESS禁止使用session。當然這并不絕對,前后端分離的應用通過一些辦法也是可以使用session的,這不是本文的核心內容不做贅述。將我們的自定義jwtAuthenticationTokenFilter,加載到UsernamePasswordAuthenticationFilter的前面。
五、測試一下:
測試登錄接口,即:獲取token的接口。輸入正確的用戶名、密碼即可獲取token。
下面我們訪問一個我們定義的簡單的接口“/hello”,但是不傳遞JWT令牌,結果是禁止訪問。當我們將上一步返回的token,傳遞到header中,就能正常響應hello的接口結果。
以上所述是小編給大家介紹的springboot以FTP方式上傳文件到遠程服務器的流程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網站的支持!如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
看完上述內容,你們對springboot怎么以FTP方式上傳文件到遠程服務器有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。