成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring之旅第十二站:Spring Security 數(shù)據(jù)存儲(chǔ)、攔截請(qǐng)求 、認(rèn)證用戶、*、

YuboonaZhang / 2477人閱讀

摘要:?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è)注冊(cè)在Spring上下文中。

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è)面模板的話,只要

標(biāo)簽的action屬性添加了Thymeleaf命名空間前綴 。那么就會(huì)自動(dòng)生成一個(gè)“_csrf”隱藏域:


如果使用JSP作為模板的話


處理CSRF的另一種方式就是根本不去處理它,可以在配置中通過調(diào)用csrf()和.disable()禁用Spring Security的CSRF防護(hù)功能。

@Override
protected void configure(HttpSecurity http) throws Exception {
                .and()
                .csrf()
                .disable()
}

需要提醒的是:禁用CSRF防護(hù)功能通常來講并不是一個(gè)好主意。

10、認(rèn)證用戶

formLogin方法啟用了基本的登錄頁(yè)功能

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()    啟用默認(rèn)的登錄頁(yè)
        .and()
        .authorizeRequests()
            .antMatchers("/").authenticated()
            .antMatchers("/spitter/me").authenticated()
            .antMatchers(HttpMethod.POST, "/spittles").authenticated()
            .anyRequest().permitAll();
}

添加自定義的登錄頁(yè)面


  
    Spitter
    
  
  
    

  
Register
User:
Password:

需要注意的是,在Thymeleaf模板中,包含了username和Password輸入域,就像默認(rèn)的登錄頁(yè)一樣,它也提交到了相對(duì)于上下文的“/login”頁(yè)面上,因?yàn)檫@是一個(gè)Thymeleaf模板,因此隱藏了"_csrf"域?qū)⒆詣?dòng)添加到表單中。

11、啟用HTTP Basic認(rèn)證

對(duì)于應(yīng)用程序的人類用戶來說,基于表單的認(rèn)證是比較理想的,第十六章REST API 就不合適了。

HTTP Basic 認(rèn)證會(huì)直接通過HTTP請(qǐng)求文本身,對(duì)要訪問的應(yīng)用程序的用戶進(jìn)行認(rèn)證。當(dāng)在Web瀏覽器中使用時(shí),他將向用戶彈出一個(gè)簡(jiǎn)單的模態(tài)對(duì)話框。

如果要啟用HTTP Basic認(rèn)證的話,只需在configure()方法所傳入的HTTPSecurity對(duì)象上調(diào)用HTTPBasic()方法既可,另外還可以調(diào)用realmName()方法指定域。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/login")
        .and()
         .httpBasic()
             .realmName("Spittr")
        .and()

在configure中,通過調(diào)用add()方法來將不同的配置指令連接在一起。

啟用remember-me

不需要每次都認(rèn)證了。

.and()
.rememberMe()
    .tokenRepository(new InMemoryTokenRepositoryImpl())
    .tokenValiditySeconds(2419200)
    .key("spittrKey")
.and()

默認(rèn)情況下,這個(gè)功能通過在cookie中存儲(chǔ)一個(gè)token完成的,這個(gè)token最多兩周有效。但是,在這里我們指定這個(gè)token最多四周有效 (2,419,200秒)。

在登錄表單中,增加一個(gè)簡(jiǎn)單復(fù)選框就可以完成這件事

在應(yīng)用中,與登錄通用重要的就是退出,

退出功能

退出功能是通過Servlet的Filter實(shí)現(xiàn)的。這個(gè)Filter會(huì)攔截針對(duì)“/logout”的請(qǐng)求,因此,為應(yīng)用添加退出功能只需要添加如下的鏈接即可。

Logout

當(dāng)用戶點(diǎn)擊這個(gè)鏈接的時(shí)候 ,會(huì)發(fā)起對(duì)“/logout”的請(qǐng)求,這個(gè)請(qǐng)求會(huì)被Spring Security的LogouFilter所處理,用戶會(huì)退出應(yīng)用,所有的Remember-me token都會(huì)被清除。在退出完成后,用戶瀏覽器將會(huì)重定向到“/login?logout”,從而允許用戶在此登錄

如果你希望用戶被重定向到其他的頁(yè)面,如應(yīng)用的首頁(yè),那么可以在configure()中進(jìn)行如下的配置

@Override
protected void configure(HttpSecurity http) throws Exception {
       http
           .formLogin()
               .loginPage("/login")
       .and()
           .logout()
               .logoutSuccessUrl("/")

到目前為止,我們已經(jīng)看到了如何在發(fā)起請(qǐng)求的時(shí)候保護(hù)Web應(yīng)用。接下來,我們將會(huì)看一下如何添加視圖級(jí)別的安全性。

11、保護(hù)視圖

Spring Security 的JSP標(biāo)簽庫(kù)

如果用戶通過訪問控制列表授予了指定的權(quán)限,那么渲染該標(biāo)簽的內(nèi)容

渲染當(dāng)前用戶認(rèn)證的詳細(xì)信息

如果用戶被授予了特定的權(quán)限那么渲染該標(biāo)簽的內(nèi)容

為了使用標(biāo)簽庫(kù)首先需要聲明

<%@ taglib  prefix="security"
        url="http://www.springframework.org.security/tags"

待續(xù),,好累,大家鼓勵(lì)下我好嗎?點(diǎn)贊,評(píng)論都可以。

12 小節(jié)(hahaha)

對(duì)于許多應(yīng)用而言,安全性都是非常重要的切面。Spirng Security 提供了一種簡(jiǎn)單、靈活且強(qiáng)大的機(jī)制來保護(hù)我們的應(yīng)用程序。

借助于一系列Servlet Filte,Spring Security 能夠控制對(duì)Web資源的訪問,包括Spring MVC控制器,借助于Spring Security的Java配置模型,我們不必直接處理Filter,能夠非常簡(jiǎn)潔地聲明為Web安全性功能。

當(dāng)認(rèn)證用戶時(shí),Spring Security提供了多種選項(xiàng),我們探討了如何基于內(nèi)存用戶庫(kù),關(guān)系型數(shù)據(jù)庫(kù)和LDAP目錄服務(wù)器來配置認(rèn)證功能。如果這些可選方案無法滿足你的需求的話,我們還學(xué)習(xí)力如何創(chuàng)建和配置自定義的用戶服務(wù)。

在前面的幾章中,我們看到了如何將Spring運(yùn)用到應(yīng)用程序的前端,在接下來的章中,我們還會(huì)繼續(xù)深入這個(gè)技術(shù)棧,學(xué)習(xí)Spring如何在后端發(fā)揮作用,下一章將會(huì)首先從Spring的JDBC抽象開始。

期待》》》》。。。。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68593.html

相關(guān)文章

  • Spring之旅二站:bean、新特性。。。

    摘要:除了,還簡(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...

    luodongseu 評(píng)論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開源的優(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的搭建...

    keelii 評(píng)論0 收藏0
  • 使用JWT保護(hù)你的Spring Boot應(yīng)用 - Spring Security實(shí)戰(zhàn)

    摘要:創(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...

    wemall 評(píng)論0 收藏0
  • [直播視頻] 《Java 微服務(wù)實(shí)踐 - Spring Boot 系列》限時(shí)折扣

    摘要:作為微服務(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)體系,...

    Enlightenment 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<