摘要:?jiǎn)⒂冒踩赃@個(gè)簡(jiǎn)單的默認(rèn)配置指定了如何保護(hù)請(qǐng)求,以及客戶端認(rèn)證用戶的方案。基于數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證用戶數(shù)據(jù)通常會(huì)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,并通過進(jìn)行訪問。必須經(jīng)過認(rèn)證其他所有請(qǐng)求都是允許的,不需要認(rèn)證。要求用戶不僅需要認(rèn)證,還要具備權(quán)限。
Spring Security
Spring Security 是基于Spring 應(yīng)用程序提供的聲明式安全保護(hù)的安全框架。Spring Sercurity 提供了完整的安全性解決方案,它能夠在Web請(qǐng)求級(jí)別和方法調(diào)用級(jí)別處理身份認(rèn)證和授權(quán),因?yàn)槭腔赟pring,所以Spring Security充分利用了依賴注入(Dependency injection DI) 和面向切面的技術(shù)。
Spring Security從兩個(gè)角度來解決安全性,他使用Servlet規(guī)范中的Filter保護(hù)Web請(qǐng)求并限制URL級(jí)別的訪問。Spring Security還能夠使用AOP保護(hù)方法調(diào)用——借助于對(duì)象代理和使用通知,能夠取保只有具備適當(dāng)權(quán)限的用戶才能訪問安全保護(hù)的方法。
說明如果你有幸能看到。后面的章節(jié)暫時(shí)不更新了,改變學(xué)習(xí)方式了。重要理解思想,這本書寫的太好了。記得要看作者的代碼,書上只是闡述了知識(shí)點(diǎn)。還有以后會(huì)把重點(diǎn)放在GitHub上,閱讀別人的代碼,自己理解的同時(shí)在模仿出來,分享給大家。你們的點(diǎn)贊就是對(duì)我的支持,謝謝大家了。
1、本文參考了《Spring 實(shí)戰(zhàn)》重點(diǎn)內(nèi)容,參考了作者GitHub上的代碼,推薦使用chrome上的GitHub插件Insight.io,FireFox也有。
2、本文只為記錄作為以后參考,要想真正領(lǐng)悟Spring的強(qiáng)大,請(qǐng)看原書。跟著作者套路來,先別瞎搗騰?。?!
3、在一次佩服老外,國(guó)外翻譯過來的書,在GiuHub上大都有實(shí)例??磿臅r(shí)候,跟著敲一遍,效果很好。
4、代碼和筆記在這里GitHub,對(duì)你有幫助的話,歡迎點(diǎn)贊。
5、每個(gè)人的學(xué)習(xí)方式不一樣,找到合適自己的就行。2018,加油。
6、Java 8 In Action 的作者M(jìn)ario Fusco
7、Spring In Action 、Spring Boot In Action的作者Craig Walls
8、知其然,也要知其所以然。有些是在Atom上手敲的,有拼寫錯(cuò)誤,還請(qǐng)見諒。
9、Spring Web Flow 在項(xiàng)目中用的多嗎??感覺不錯(cuò)的樣子,就不發(fā)筆記了.
談一些個(gè)人感受
1、趕快學(xué)習(xí)Spring吧,Spring MVC 、Spring Boot 、微服務(wù)。
2、重點(diǎn)中的重點(diǎn),學(xué)習(xí)JDK 8 Lambda,Stream,Spring 5 最低要求JDK1.8.
3、還有Netty、放棄SH吧,不然你會(huì)落伍的。
4、多看一些國(guó)外翻譯過來的書,例如 Xxx In Action 系列。權(quán)威指南系列。用Kindle~
5、寫代碼之前先寫測(cè)試,這就是老外不同之處。學(xué)到了很多技巧。
6、再一次佩服老外對(duì)細(xì)節(jié)的處理。值得我們每一個(gè)人學(xué)習(xí)
1、理解Spring Security的模塊將Spring Security模塊添加到應(yīng)用程序的類路徑下。應(yīng)用程序的類路徑下至少包含core和Configuration這兩個(gè)模塊。它經(jīng)常被用于保護(hù)Web應(yīng)用,添加Web模塊,同時(shí)還需要JSP標(biāo)簽庫(kù)。
2、過濾Web請(qǐng)求Spring Security借助一系列Servlet Filter來提供各種安全性功能。
DelegatingFilterProxy是一個(gè)特殊的ServletFilter,它本身所作的工作并不多,只是將工作委托給一個(gè)Javax.servlet.Filter實(shí)現(xiàn)類,這個(gè)實(shí)現(xiàn)類作為一個(gè)
web.xml配置
springSecurityFilterChain org.springframework.web.filter.DelegatingFilterproxy
DelegatingFilterproxy會(huì)將過濾邏輯委托給它。
如果你希望借助于WebApplicationInitializer以JavaConfig配置,需要一個(gè)擴(kuò)展類
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; /** * Created by guo on 2/26/2018. */ public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer { }
AbstractSecurityWebApplicationInitializer實(shí)現(xiàn)了WebapplicationInitializer,因此Spirng會(huì)發(fā)現(xiàn)他,并用它在Web容器中注冊(cè)DelegatingFilterproxy.它不需要重載任何方法。它會(huì)攔截發(fā)往應(yīng)用中的請(qǐng)求,并將其委托給springSecurityFilterChain
Spting Security依賴一系列ServletFilter來提供不同的安全特性。但是你不需要細(xì)節(jié)。當(dāng)我們啟用Web安全性的時(shí)候,會(huì)自動(dòng)創(chuàng)建這些Filter。
3、編寫簡(jiǎn)單的安全性配置。Spring 3.2引入了新的java配置方案,完全不需要通過XML來配置安全性功能了。
@Configuration @EnableWebSecurity //啟用Web安全性 public class SecurityConfig extends WebSecurityConfigurerAdapter { }
@EnableWebSecurity啟用Web安全功能,但它本身并沒有什么用處 ,Spring Security必須配置在一個(gè)實(shí)現(xiàn)類WebSecurityConfigurer的bean中。
如果你的應(yīng)用碰巧是在使用Spirng MVC的話,那么就應(yīng)該考慮使用@EnableWebMvcSecurity還能配置一個(gè)Spring MVC參數(shù)解析器。這樣的話,處理器方法就能夠通過帶有@AuthenticationPrincipal注解的參數(shù)獲取得認(rèn)證用戶的principal。它同時(shí)還配置一個(gè)bean,在使用Spring表單綁定標(biāo)簽庫(kù)來定義表單時(shí),這個(gè)bean會(huì)自動(dòng)添加一個(gè)隱藏的跨站請(qǐng)求偽造(CSRF)token的輸入流。
@Configuration @EnableWebMvcSecurity//啟用Web安全性 public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin().and() .httpBasic(); } }
這個(gè)簡(jiǎn)單的默認(rèn)配置指定了如何保護(hù)HTTP請(qǐng)求,以及客戶端認(rèn)證用戶的方案。通過調(diào)用 authorizeRequests()和anyRequest().authenticated()就會(huì)要求所欲進(jìn)入應(yīng)用的Http都要進(jìn)行認(rèn)證,他也配置Spring Securoty支持基于表單的登錄以及HTTP Basic方式的認(rèn)證。
為了讓Spring 滿足我們應(yīng)用的需求,還需要在添加一些配置。
配置用戶儲(chǔ)存
指定哪些請(qǐng)求需要認(rèn)證,那些請(qǐng)求不需要認(rèn)證,以及所需要的權(quán)限
提供一個(gè)自定義的登錄頁(yè)面,替代原來簡(jiǎn)單的默認(rèn)登錄頁(yè)。
除了Spring Security的這些功能,我們可能還希望給予安全限制,有選擇性在Web視圖上顯示特定的內(nèi)容。
4 選擇查詢用戶詳細(xì)信息的服務(wù)。我們所需要的是用戶的存儲(chǔ),也就是用戶名、密碼以及其他信息存儲(chǔ)的地方,在進(jìn)行認(rèn)證決策的時(shí)候,對(duì)其進(jìn)行檢索。
好消息是Spring Security非常靈活,能夠給予各種數(shù)據(jù)庫(kù)存儲(chǔ)來認(rèn)證用戶名,它內(nèi)置了多種常見的用戶存儲(chǔ)場(chǎng)景,如內(nèi)存、關(guān)系型數(shù)據(jù)庫(kù),以及LDAP,但我們也可以編寫并插入自定義的用戶存儲(chǔ)實(shí)現(xiàn)。
借助于Spring Security的Java配置,我們能夠很容易的配置一個(gè)或多個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)方案。
5、使用基于內(nèi)存的用戶存儲(chǔ)
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("password").roles("USER").and() .withUser("admin").password("password").roles("USER","ADMIN"); }
通過簡(jiǎn)單那的調(diào)用inMemoryAuthentication就能啟用內(nèi)存用戶村蘇。但是,我們還需要一些用戶,否則的話這個(gè)沒用戶并沒有且別。需要調(diào)用weithuser為其存儲(chǔ)添加新的用戶。以及給定用戶授予一個(gè)或多個(gè)角色權(quán)限的reles()方法
對(duì)于調(diào)式和開發(fā)人員來講,基于內(nèi)存的用戶存儲(chǔ)是很有用的,但對(duì)于生產(chǎn)級(jí)別應(yīng)用來講,這就不是最理想的狀態(tài)了。
5、基于數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證用戶數(shù)據(jù)通常會(huì)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,并通過JDBC進(jìn)行訪問。為了配置Spring Security使用以JDBC為支撐的用戶存儲(chǔ),我們可以使用jdbcAuthentication()方法,所需的最少配置。
@Autowired DataSource dataSource; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication() .dataSource(dataSource); }
我們必須要配置的知識(shí)一個(gè)DataSource,這樣的話就能 訪問關(guān)系型數(shù)據(jù)庫(kù)里。
盡管默認(rèn)的最少配置能夠讓一切運(yùn)轉(zhuǎn)起來,但是,它對(duì)我們的數(shù)據(jù)庫(kù)模式有一些要求。它預(yù)期存在某些存儲(chǔ)用戶數(shù)據(jù)的表。
public static final String DEF_USERS_BY_USERNAME_QUERY = "select username,password,enabled " + "from users " + "where username = ?"; public static final String DEF_AUTHORITIES_BY_USERNAME_QUERY = "select username,authority " + "from authorities " + "where username = ?"; public static final String DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY = "select g.id, g.group_name, ga.authority " + "from groups g, group_members gm, group_authorities ga " + "where gm.username = ? " + "and g.id = ga.group_id " + "and g.id = gm.group_id";
在第一個(gè)查詢中,我們獲取了用戶的用戶名、密碼以及是否啟用的信息,這些信息用來進(jìn)行用戶認(rèn)證。接下來查詢查找 了用戶所授予的權(quán)限,用來進(jìn)行鑒權(quán)。最后一個(gè)查詢中,查找了用戶作為群組的成員所授予的權(quán)限。
如果你能夠在數(shù)據(jù)庫(kù)中定義和填充滿足這些查詢的表,那么基本上就不需要你在做什么額外的事情了。
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery( "select username,password,true" + "from Spitter where username=?") .authoritiesByUsernameQuery( "select username,"ROLE_USER" from Spitter where username=?"); }
在本例中,我們只重寫了認(rèn)證和基本權(quán)限的查詢語句,但是通過調(diào)用groupAuthoritiesByUsername()方法,我們也能夠?qū)⑷航M權(quán)限重寫為自定義的查詢語句。
為了解決密碼明文的問題,我們借助于passwordEncode()方法指定一個(gè)密碼轉(zhuǎn)碼器(encoder)
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery( "select username,password,true" + "from Spitter where username=?") .authoritiesByUsernameQuery( "select username,"ROLE_USER" from Spitter where username=?") .passwordEncoder(new StandardPasswordEncoder("53cd3t")); }
passwordEncoder()方法可以接受Spring Security中passwordEncoder接口的任意實(shí)現(xiàn)。加密模塊包含了三個(gè)這樣的實(shí)現(xiàn)
StandardPasswordEncoder
NoOpPasswordEncoder
BCryptPasswordEncoder
上述代碼使用了StandardPasswordEncoder,但是如果內(nèi)置的實(shí)現(xiàn)無法滿足需求時(shí),你可以提供自定義的實(shí)現(xiàn) ,passwordEncoder接口如下:
package org.springframework.security.crypto.password; /** * Service interface for encoding passwords. */ public interface PasswordEncoder { /** * Encode the raw password. */ String encode(CharSequence rawPassword); /** * Verify the encoded password obtained from storage matches the submitted raw password after it too is encoded. */ boolean matches(CharSequence rawPassword, String encodedPassword); }
不管使用哪一個(gè)密碼轉(zhuǎn)化器,都需要理解的一點(diǎn)是:數(shù)據(jù)庫(kù)的秘密是永遠(yuǎn)不會(huì)解碼的,所采取的策略與之相反。用戶在登錄時(shí)輸入的密碼會(huì)按照相同的算法進(jìn)行轉(zhuǎn)碼,然后在于數(shù)據(jù)庫(kù)中已經(jīng)轉(zhuǎn)碼過的密碼進(jìn)行對(duì)比,這個(gè)對(duì)比是在PasswordEncoder的matches()方法中進(jìn)行的。
6、基于LDAP進(jìn)行認(rèn)證為了讓Spring Security使用基于LDAP的認(rèn)證,我們可以使用ldapAuthentication()方法,這個(gè)方法類似于jdbcAuthentication()只不過是LDAP版本
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.ldapAuthentication() .userSearchBase("(uid={0})") .groupSearchFilter("member={0}"); }
配置密碼比對(duì)
基于LDAP進(jìn)行認(rèn)證的默認(rèn)策略是進(jìn)行綁定操作,直接通過LDAP服務(wù)器認(rèn)證用戶,另一種可選的方式是進(jìn)行對(duì)比,涉及到輸入的 密碼發(fā)送到LDAP目錄上,并要求服務(wù)器將這個(gè)密碼和用戶的密碼進(jìn)行對(duì)比,因?yàn)閷?duì)比是用LDAP服務(wù)器內(nèi)完成的。實(shí)際的秘密能保持私密。
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.ldapAuthentication() .groupSearchBase("on=people") .userSearchBase("(uid={0})") .groupSearchFilter("member={0}") .groupSearchBase("on=groups") .groupSearchFilter("member={0}") .passwordCompare(); }
如果密碼被保存在不同的屬性中,可以通過passwordAttribute()方法來聲明密碼屬性的名稱
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.ldapAuthentication() .groupSearchBase("on=people") .userSearchBase("(uid={0})") .groupSearchFilter("member={0}") .groupSearchBase("on=groups") .groupSearchFilter("member={0}") .passwordCompare() .passwordEncoder(new Md5PasswordEncoder()) .passwordAttribute("passcode"); }
為了避免這一點(diǎn)我們可以通過調(diào)用passwordEncoder()方法指定加密策略。本例中使用MD5加密,這需要LDAP服務(wù)器上密碼也是MD5進(jìn)行加密
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.ldapAuthentication() .groupSearchBase("on=people") .userSearchBase("(uid={0})") .groupSearchFilter("member={0}") .groupSearchBase("on=groups") .groupSearchFilter("member={0}") .contextSource() .root("dc=guo,dc=com"); //.url() .ldif("classpath:users.ldif"); //這里是可以分開放的,需要定義users.ldif文件 }7、攔截請(qǐng)求
在任何的應(yīng)用中,并不是所有的頁(yè)面都需要同等程度地保護(hù)。盡管用戶基本信息頁(yè)面時(shí)公開的。但是,如果當(dāng)處理“/spitter/me”時(shí),通過展現(xiàn)當(dāng)前用戶的基本信息那么就需要進(jìn)行認(rèn)證,從而確定要展現(xiàn)誰的信息。
對(duì)每個(gè)請(qǐng)求進(jìn)行細(xì)粒度安全性控制的關(guān)鍵在于重載configure(HttpSecurity)方法。
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("spitters/me").authenticated() //進(jìn)行認(rèn)證。 .antMatchers(HttpMethod.POST,"/spittles").authenticated() //必須經(jīng)過認(rèn)證 .anyRequest().permitAll(); //其他所有請(qǐng)求都是允許的,不需要認(rèn)證。 }
antMatchers()方法中設(shè)置的路徑支持Ant風(fēng)格的通配符。
.antMatchers("spitters/**").authenticated()
.antMatchers("spitters/**","spittles/mine").authenticated()
.antMatchers("spitters/.*").authenticated()
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("spitters/me").authenticated() .antMatchers(HttpMethod.POST, "/spittles") .hasAuthority("ROLE_SPITTER") .anyRequest().permitAll(); }
要求用戶不僅需要認(rèn)證,還要具備ROLE_SPITTER權(quán)限。作為替代方案,還可以使用hasRole()方法,它會(huì)自動(dòng)使用“ROLE_”前綴
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("spitters/me").authenticated() .antMatchers(HttpMethod.POST,"/spittles").hasRole("SPITTER") .anyRequest().permitAll(); }
很重要的一點(diǎn)是將最為具體的請(qǐng)求路徑放到最前面,而最不具體的路徑放到最后面,如果不這樣做的話,那不具體的配置路徑將會(huì)覆蓋掉更為具體的路徑配置
8、使用Spirng表達(dá)式進(jìn)行安全保護(hù)比SpEL更為強(qiáng)大的原因在于,HasRole()僅僅是Spring支持的安全相關(guān)表達(dá)式中的一種。
Spring Security支持的所有表達(dá)式。
principal : 用戶的principl對(duì)象
permitAll :結(jié)果始終為true
hasRole 如果用戶被授予了指定的角色 結(jié)果為true
authentication :用戶認(rèn)證對(duì)象
denyAll 結(jié)果始終為false
。。。。
在掌握了Spring Security 的SpEL表達(dá)式后,我們就能夠不再局限于基于用戶的權(quán)限進(jìn)訪問限制了。
9、強(qiáng)制通道的安全性使用HTTP提交數(shù)據(jù)是一件具有風(fēng)險(xiǎn)的事情。通過HTTP發(fā)送的數(shù)據(jù)沒有經(jīng)過加密,黑客就有機(jī)會(huì)攔截請(qǐng)求并且能夠看到他們想看到的信息。這就是為什么銘感的 數(shù)據(jù)要通過HTTPS來加碼發(fā)送的原因。
使用HTTPS似乎很簡(jiǎn)單,你要做的事情只是在URL中的HTTP后加上一個(gè)字母“s”就可以了,是嗎? 是的,不加也可以的。哈哈哈。。。
這是真的,但這是把使用的HTTPS通道的責(zé)任放在了錯(cuò)誤的地方。
為了保證注冊(cè)表單的數(shù)據(jù)通過HTTPS傳遞,我們可以在配置中添加requiresChannel()方法
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("spitters/me").authenticated() .antMatchers(HttpMethod.POST,"/spittles").hasRole("SPITTER") .anyRequest().permitAll() .and() .requiresChannel() .antMatchers("/spitter/form").requiresSecure(); //需要HTTPS }
不論何時(shí),只要是對(duì)“/spitter/form”的請(qǐng)求,Spring Security 都視為需要安全通道(通過調(diào)用requiresChannel()確定)并自動(dòng)將請(qǐng)求重定向到HTTPS上。
與之相反,有些頁(yè)面并不需要設(shè)置通過HTTPS傳遞。將首頁(yè)聲明為始終通過HTTP傳送。
.antMatchers("/").requiresInecure();
如果通過HTTPS發(fā)送了對(duì)"/"的請(qǐng)求,Spring Security將會(huì)把請(qǐng)求重定向到不安全的HTTP通道上。
10、防止跨站請(qǐng)求偽造如果POST的請(qǐng)求來源于其他站點(diǎn)的話,跨站請(qǐng)求偽造(cross-site request forgery CSRF),簡(jiǎn)單來講,如果一個(gè)站點(diǎn)欺騙用戶提交請(qǐng)求到其他服務(wù)器上的話,就會(huì)發(fā)生CSRF攻擊,這可能會(huì)帶來消極的后果。從Spring Security 3.2開始,默認(rèn)就會(huì)啟用CSRF防護(hù)。實(shí)際上,除非你 采取行為處理CSRF防護(hù)或者將這個(gè)功能禁用。否則的話,在應(yīng)用提交表單的時(shí)候會(huì)遇到問題。
Spring Security 通過一個(gè)同步的token的方式來實(shí)現(xiàn)CSRF防護(hù)的功能。它將會(huì)攔截狀態(tài)變化的請(qǐng)求并檢查CSRF token,如果請(qǐng)求中不包含 CSRF token的話,或者token不能與服務(wù)器端的token相匹配,請(qǐng)求將會(huì)失敗,并拋出CsrfException異常。
這意味著在你的應(yīng)用中,所有的表單必須在一個(gè)"_csrf"域中提交token,而且這個(gè)token必須要與服務(wù)器端計(jì)算并存儲(chǔ)的token一致。這樣的話當(dāng)表單提交的時(shí)候,才能匹配。
好消息是Spirng Security已經(jīng)簡(jiǎn)化了將token放到請(qǐng)求屬性中這一任務(wù)。如果你使用Thymeleaf作為頁(yè)面模板的話,只要
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68593.html
摘要:除了,還簡(jiǎn)單介紹了對(duì)的支持,可以幫助應(yīng)用將散落在各處的邏輯匯集于一處切面。當(dāng)裝配的時(shí)候,這些切面能夠運(yùn)行期編織起來,這樣就能呢個(gè)非常有效的賦予新功能。 第1章 Spring之旅 說明 1、本文參考了《Spring 實(shí)戰(zhàn)》重點(diǎn)內(nèi)容,參考了GitHub上的代碼 2、每個(gè)人的學(xué)習(xí)方式不一樣,但目的是一樣的,活學(xué)活用。最近一直在聽《我們不一樣》 3、本文只為記錄作為以后參考,要想真正領(lǐng)悟Sp...
摘要:框架具有輕便,開源的優(yōu)點(diǎn),所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實(shí)現(xiàn)身份驗(yàn)證往期譯見系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:創(chuàng)建應(yīng)用有很多方法去創(chuàng)建項(xiàng)目,官方也推薦用在線項(xiàng)目創(chuàng)建工具可以方便選擇你要用的組件,命令行工具當(dāng)然也可以。對(duì)于開發(fā)人員最大的好處在于可以對(duì)應(yīng)用進(jìn)行自動(dòng)配置。 使用JWT保護(hù)你的Spring Boot應(yīng)用 - Spring Security實(shí)戰(zhàn) 作者 freewolf 原創(chuàng)文章轉(zhuǎn)載請(qǐng)標(biāo)明出處 關(guān)鍵詞 Spring Boot、OAuth 2.0、JWT、Spring Security、SS...
摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強(qiáng)大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實(shí)踐為系列講座,專題直播節(jié),時(shí)長(zhǎng)高達(dá)小時(shí),包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡(jiǎn)介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開發(fā)人員必備技術(shù)。無論是互聯(lián)網(wǎng)、云計(jì)算還是大數(shù)據(jù),Java平臺(tái)已成為全棧的生態(tài)體系,...
閱讀 3422·2021-11-22 13:53
閱讀 3464·2021-10-11 11:11
閱讀 964·2019-08-30 14:12
閱讀 1256·2019-08-29 17:16
閱讀 679·2019-08-29 16:45
閱讀 3394·2019-08-29 12:56
閱讀 704·2019-08-28 17:55
閱讀 2101·2019-08-26 13:24