1. 程式人生 > >spring security 4.0 教程 步步深入 5

spring security 4.0 教程 步步深入 5

5. Java 配置

在Spring 3.1中向Spring框架添加了對Java配置的常規支援。 自Spring Security 3.2以來,一直有Spring Security Java配置支援,使使用者能夠輕鬆地配置Spring Security而不使用任何XML。 如果你熟悉第6章,安全名稱空間配置,那麼你應該發現它和安全Java配置支援之間有幾個相似之處。

Spring Security提供了許多以-j結尾的示例應用程式,演示了使用Spring Security Java配置。

5.1 初識 Java 配置

第一步是建立我們的Spring Security Java配置。 配置建立一個名為springSecurityFilterChain的Servlet過濾器,它負責應用程式中的所有安全性(保護應用程式URL,驗證提交的使用者名稱和密碼,重定向到登入表單等)。 你可以在下面找到Spring Security Java配置的最基本的例子:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("cmx").password("123").roles("USER");
    }
}

並沒有太多的配置,但它做了很多。您可以在下面找到功能的摘要:

5.1.1 AbstractSecurityWebApplicationInitializer

下一步是使用war註冊springSecurityFilterChain。 這可以在Java配置中使用Spring的WebApplicationInitializer支援在Servlet 3.0+環境中完成。不奇怪,Spring Security提供了一個基類AbstractSecurityWebApplicationInitializer,它將確保springSecurityFilterChain為您註冊。 我們使用AbstractSecurityWebApplicationInitializer的方式取決於我們是否已經使用Spring,或者如果Spring Security是我們應用程式中唯一的Spring元件。

5.1.2 AbstractSecurityWebApplicationInitializer without Existing Spring

如果你不使用Spring或Spring MVC,你需要將WebSecurityConfig傳入超類,以確保配置被選中。 你可以找到一個例子:

import org.springframework.security.web.context.*;

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(WebSecurityConfig.class);
    }
}

SecurityWebApplicationInitializer將做以下一些事情:

  • 為應用程式中的每個URL自動註冊springSecurityFilterChain Filter
  • 新增一個載入 WebSecurityConfig 的ContextLoaderListener.

5.1.3 AbstractSecurityWebApplicationInitializer with Spring MVC

如果我們在應用程式的其他地方使用Spring,我們可能已經有一個WebApplicationInitializer載入我們的Spring配置。 如果我們使用以前的配置,我們會出錯。 相反,我們應該使用現有的ApplicationContext註冊Spring Security。 例如,如果我們使用Spring MVC,我們的SecurityWebApplicationInitializer將類似於以下內容:

import org.springframework.security.web.context.*;

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

}

這將只是為您的應用程式中的每個URL註冊springSecurityFilterChain過濾器。 之後,我們將確保WebSecurityConfig載入在我們現有的ApplicationInitializer中。 例如,如果我們使用Spring MVC,它將被新增到getRootConfigClasses()

public class MvcWebApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { WebSecurityConfig.class };
    }

    // ... other overrides ...
}

5.2 HttpSecurity

到目前為止,我們的WebSecurityConfig只包含有關如何驗證我們的使用者的資訊。 Spring Security知道我們想要求所有使用者進行身份驗證? Spring Security知道我們要支援基於表單的身份驗證? 其原因是WebSecurityConfigurerAdapterconfigure(HttpSecurity http)方法中提供了一個預設配置,如下所示:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .httpBasic();
}

上面的預設配置:

  • 確保對我們的應用程式的任何請求需要使用者進行身份驗證
  • 允許使用者使用基於表單的登入進行身份驗證
  • 允許使用者使用HTTP Basic進行身份驗證

您會注意到,此配置與XML名稱空間配置非常相似:

<http>
    <intercept-url pattern="/**" access="authenticated"/>
    <form-login />
    <http-basic />
</http>

關閉XML標籤的Java配置等同於使用和()方法表示,這允許我們繼續配置父代。 如果你讀的程式碼,這也有意義。 我想配置授權的請求並配置表單登入和配置HTTP基本認證。 但是,Java配置具有不同的預設URL和引數。 建立自定義登入頁面時請記住這一點。 結果是我們的URL更加RESTful。 此外,它不是很明顯,我們使用Spring Security有助於防止資訊洩漏。 例如:

5.3 Java配置和表單登入

您可能想知道當提示登入時登入表單來自哪裡,因為我們沒有提到任何HTML檔案或JSP。 由於Spring Security的預設配置沒有為登入頁面顯式設定URL,Spring Security會根據啟用的功能自動生成一個URL,並使用處理提交的登入的URL的標準值,使用者將使用的預設目標URL 傳送到登入後等等。 雖然自動生成的登入頁面方便快速啟動和執行,但大多數應用程式想要提供自己的登入頁面。 為此,我們可以更新我們的配置,如下所示:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login") //1
            .permitAll(); //2
}

1 更改配置以指定login頁面
2 我們必須授予所有使用者(即未經身份驗證的使用者)對我們登入頁面的訪問許可權。 formLogin().permitAll()方法允許向所有使用者授予與基於表單的登入相關聯的所有URL的訪問許可權

使用JSP實現的用於當前配置的示例登入頁面如下所示:

下面的登入頁面代表我們當前的配置。如果某些預設設定不能滿足我們的需要,我們可以輕鬆修改我們的配置。

<c:url value="/login" var="loginUrl"/>
<form action="${loginUrl}" method="post">  //1
    <c:if test="${param.error != null}">  //2
        <p>
            Invalid username and password.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">  //3
        <p>
            You have been logged out.
        </p>
    </c:if>
    <p>
        <label for="username">Username</label>
        <input type="text" id="username" name="username"/>  //4
    </p>
    <p>
        <label for="password">Password</label>
        <input type="password" id="password" name="password"/>  //5
    </p>
    <input type="hidden"  //6
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Log in</button>
</form>

1 嘗試對 /login 傳送post請求以驗證使用者

2 如果查詢引數 param.error 存在,則驗證失敗

3 如果查詢引數 param.logout 存在,則登出成功

4 使用者名稱必須以 username 為http請求引數

5 密碼必須以 password 為http請求引數

6 這部分我們必須在第18.4.3節“包括CSRF令牌”中瞭解更多,請參閱第18章,跨站點請求偽造(CSRF)部分的參考

5.4 驗證請求

我們的示例只需要對使用者進行身份驗證,並且對我們的應用程式中的每個網址都這樣做。我們可以通過向我們的http.authorizeRequests()方法新增多個子節點來指定我們的URL的自定義要求。例如:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()  //1
            .antMatchers("/resources/**", "/signup", "/about").permitAll()  //2
            .antMatchers("/admin/**").hasRole("ADMIN")  //3
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")  //4
            .anyRequest().authenticated()  //5
            .and()
        // ...
        .formLogin();
}

1 http.authorizeRequests()方法有多個子節點,每個匹配器都按它們宣告的順序考慮

2 我們指定了多個使用者可以訪問的網址格式。具體來說,如果網址以”/resources/”開頭,等於”/signup”或等於”/about”,則任何使用者都可以訪問請求。

3 以”/admin/”開頭的任何網址將被重新分配給具有角色”ROLE_ADMIN”的使用者。你會注意到,由於我們呼叫了hasRole方法,我們不需要指定”ROLE_”字首

4 以”/db/”開頭的任何URL都要求使用者同時擁有”ROLE_ADMIN”和”ROLE_DBA”。 你會注意到,由於我們使用hasRole表示式,我們不需要指定”ROLE_”字首

5 任何尚未匹配的URL只需要對使用者進行身份驗證

5.5 登出登入

使用WebSecurityConfigurerAdapter時,會自動應用登出功能。 預設情況下,訪問URL /logout將通過以下方式記錄使用者:

  • 使HTTP session無效
  • 清除配置的任何RememberMe身份驗證
  • 清除 SecurityContextHolder
  • 跳轉至 /login?logout

與配置登入功能類似,您還可以使用各種選項進一步自定義您的登出要求:

protected void configure(HttpSecurity http) throws Exception {
    http
        .logout()  //1
            .logoutUrl("/my/logout")  //2
            .logoutSuccessUrl("/my/index")  //3
            .logoutSuccessHandler(logoutSuccessHandler)  //4
            .invalidateHttpSession(true)  //5
            .addLogoutHandler(logoutHandler)  //6
            .deleteCookies(cookieNamesToClear)  //7
            .and()
        ...
}

1 提供登出支援。這在使用WebSecurityConfigurerAdapter時自動應用。

2 觸發登出的URL(預設為/logout)。如果啟用CSRF保護(預設),則請求也必須是POST。有關資訊,請參閱JavaDoc

3 發生登出後重定向到的URL。預設值為/login?logout。有關資訊,請參考JavaDoc。

4 讓我們指定一個自定義LogoutSuccessHandler。如果指定此引數,將忽略logoutSuccessUrl()。有關資訊,請參閱JavaDoc。

5 指定在登出時是否使HttpSession無效。 預設情況下是這樣。 在封底下配置SecurityContextLogoutHandler。 有關資訊,請參閱JavaDoc。

6 新增LogoutHandler。預設情況下,SecurityContextLogoutHandler作為最後一個LogoutHandler新增。

7 允許指定在登出成功時要刪除的Cookie的名稱。這是一個顯式新增CookieClearingLogoutHandler的快捷方式。

當然,登出也可以使用XML名稱空間符號進行配置。有關更多詳細資訊,請參閱Spring Security XML名稱空間部分中的登出元素的文件。

通常,為了定製登出功能,您可以新增LogoutHandler/LogoutSuccessHandler實現。對於許多常見的情況,當使用流利的API時,這些處理程式應用在封面下

5.5.1 LogoutHandler

通常,LogoutHandler實現指示能夠參與登出處理的類。它們將被呼叫來執行必要的清理。因此,他們不應該丟擲異常。提供了各種實現:

有關詳細資訊,請參見第17.4節“Remember-Me介面和實現”。

並非直接提供LogoutHandler實現,流式API還提供了快捷方式,提供了相應的LogoutHandler實現。 例如。 deleteCookies()允許指定在登出成功時要刪除的一個或多個cookie的名稱。 與新增CookieClearingLogoutHandler相比,這是一個快捷方式。

5.5.2 登入成功控制代碼

LogoutSuccessHandler在LogoutFilter成功登出後被呼叫,以處理例如。 重定向或轉發到適當的目的地。 注意,該介面幾乎與LogoutHandler相同,但可能引發異常。

提供以下實現:

如上所述,您不需要直接指定SimpleUrlLogoutSuccessHandler。相反,流利的API通過設定logoutSuccessUrl()提供了一個快捷方式。 這將在下面設定SimpleUrlLogoutSuccessHandler。提供的URL將在發生登出後重定向到。 預設值為/login?logoutHttpStatusReturningLogoutSuccessHandler在REST API型別場景中很有趣。 成功登出後,此LogoutSuccessHandler不會重定向到URL,而是允許您提供要返回的純HTTP狀態程式碼。 如果未配置,預設情況下將返回狀態程式碼200。

5.6 認證

到目前為止,我們只看了一下最基本的認證配置。讓我們來看看一些稍微更高階的配置認證選項。

5.6.1 記憶體認證

我們已經看到了為單個使用者配置記憶體身份驗證的示例。以下是配置多個使用者的示例:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER").and()
            .withUser("admin").password("password").roles("USER", "ADMIN");
}

5.6.2 JDBC 認證

您可以找到對基於JDBC的身份驗證的更新。下面的示例假設您已經在應用程式中定義了一個DataSourcejdbc-javaconfig示例提供了使用基於JDBC的身份驗證的完整示例。

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .withDefaultSchema()
            .withUser("user").password("password").roles("USER").and()
            .withUser("admin").password("password").roles("USER", "ADMIN");
}

5.6.3 LDAP 認證

您可以找到更新以支援基於LDAP的身份驗證。 ldap-javaconfig示例提供了使用基於LDAP的身份驗證的完整示例。

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .ldapAuthentication()
            .userDnPatterns("uid={0},ou=people")
            .groupSearchBase("ou=groups");
}

上面的示例使用以下LDIF和嵌入式Apache DS LDAP例項。

dn: ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=people,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=admin,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Rod Johnson
sn: Johnson
uid: admin
userPassword: password

dn: uid=user,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Dianne Emu
sn: Emu
uid: user
userPassword: password

dn: cn=user,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: user
uniqueMember: uid=admin,ou=people,dc=springframework,dc=org
uniqueMember: uid=user,ou=people,dc=springframework,dc=org

dn: cn=admin,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: admin
uniqueMember: uid=admin,ou=people,dc=springframework,dc=org<

5.6.4 AuthenticationProvider

您可以通過將自定義AuthenticationProvider作為bean公開來定義自定義認證。例如,以下將自定義認證,假設SpringAuthenticationProvider實現AuthenticationProvider

這僅在未填充AuthenticationManagerBuilder時使用

@Bean
public SpringAuthenticationProvider springAuthenticationProvider() {
    return new SpringAuthenticationProvider();
}

5.6.5 UserDetailsService

您可以通過將自定義UserDetailsService作為bean公開來定義自定義認證。例如,以下將自定義認證,假設SpringDataUserDetailsService實現UserDetailsService

這僅在未填充AuthenticationManagerBuilder且未定義AuthenticationProviderBean時使用。

@Bean
public SpringDataUserDetailsService springDataUserDetailsService() {
    return new SpringDataUserDetailsService();
}

您還可以通過將PasswordEncoder公開為bean來自定義密碼的編碼方式。例如,如果使用bcrypt,您可以新增一個bean定義,如下所示:

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

5.7 多HttpSecurity例項

我們可以配置多個HttpSecurity例項,就像我們可以有多個<http>塊。 關鍵是要多次擴充套件WebSecurityConfigurationAdapter。 例如,以下是具有以/api/開頭的URL的不同配置的示例。

@EnableWebSecurity
public class MultiHttpSecurityConfig {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {  //1
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    @Configuration
    @Order(1)  //2
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/api/**")  //3
                .authorizeRequests()
                    .anyRequest().hasRole("ADMIN")
                    .and()
                .httpBasic();
        }
    }

    @Configuration  //4
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin();
        }
    }
}

1 配置認證正常

2 建立包含@OrderWebSecurityConfigurerAdapter的例項,以指定應首先考慮哪個WebSecurityConfigurerAdapter

3 http.antMatcher宣告這個HttpSecurity將只適用於以/api/

4 建立另一個WebSecurityConfigurerAdapter例項。 如果URL不以/api/開頭,則將使用此配置。 這個配置在ApiWebSecurityConfigurationAdapter之後被考慮,因為它在1之後有一個@Order值(沒有@Order預設值為last)。

5.8 方法Security

從2.0版本開始,Spring Security已經大大提高了對您的服務層方法新增安全性的支援。 它提供對JSR-250註釋安全性以及框架的原始@Secured註釋的支援。 從3.0,你也可以使用新的基於表示式的註釋。 您可以將安全性應用於單個bean,使用intercept-methods元素裝飾bean宣告,也可以使用AspectJ樣式切入點在整個服務層上保護多個bean。

5.8.1 EnableGlobalMethodSecurity

我們可以使用任何@Configuration例項上的@EnableGlobalMethodSecurity註釋啟用基於註釋的安全性。例如,以下將啟用Spring Security的@Secured註釋。

@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
// ...
}

向方法(在類或介面上)添加註釋將相應地限制對該方法的訪問。 Spring Security的原生註釋支援為方法定義了一組屬性。 這些將被傳遞給AccessDecisionManager,以便做出實際的決定:

public interface BankService {

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();

@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}

可以啟用對JSR-250註釋的支援

@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class MethodSecurityConfig {
// ...
}

這些是基於標準的,允許應用簡單的基於角色的約束,但沒有Spring Security的本機註釋。要使用新的基於表示式的語法,您將使用

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
// ...
}

和等效的Java程式碼

public interface BankService {

@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);

@PreAuthorize("isAnonymous()")
public Account[] findAccounts();

@PreAuthorize("hasAuthority('ROLE_TELLER')")
public Account post(Account account, double amount);
}

5.8.2 GlobalMethodSecurityConfiguration

有時,您可能需要執行比使用@EnableGlobalMethodSecurity註釋允許的操作更復雜的操作。 對於這些例項,您可以擴充套件GlobalMethodSecurityConfiguration,確保@EnableGlobalMethodSecurity註釋存在於您的子類上。 例如,如果要提供自定義的MethodSecurityExpressionHandler,可以使用以下配置:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        // ... create and return custom MethodSecurityExpressionHandler ...
        return expressionHandler;
    }
}

有關可以覆蓋的方法的其他資訊,請參閱GlobalMethodSecurityConfiguration Javadoc。

5.9 Post Processing Configured Objects

Spring Security的Java配置不公開它配置的每個物件的每個屬性。 這簡化了大多數使用者的配置。 總之,如果每個屬性都暴露出來,使用者可以使用標準bean配置。 雖然有很好的理由不直接暴露每個屬性,使用者可能仍需要更高階的配置選項。 為了解決這個問題Spring Security引入了一個ObjectPostProcessor的概念,它可以用來修改或替換由Java配置建立的許多Object例項。 例如,如果要在FilterSecurityInterceptor上配置filterSecurityPublishAuthorizationSuccess屬性,您可以使用以下命令:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                public <O extends FilterSecurityInterceptor> O postProcess(
                        O fsi) {
                    fsi.setPublishAuthorizationSuccess(true);
                    return fsi;
                }
            });
}

相關推薦

spring security 4.0 教程 步步深入 5

5. Java 配置 在Spring 3.1中向Spring框架添加了對Java配置的常規支援。 自Spring Security 3.2以來,一直有Spring Security Java配置支援,使使用者能夠輕鬆地配置Spring Security而不使用

Spring Security 4.0 CAS實現單點登入

1、各framework版本資訊       JDK 8       Tomcat 7       SpringMVC-4.2.0.RELEASE       Spring Security 4.2.0.RELEASE       CAS-Client 3.3.3       CAS-Serv

Spring Boot整合Spring Security(4.0)入門(Maven)

    之前沒有做過許可權方面的,組長讓我做下一版本的許可權管理,去看了幾篇部落格,感覺寫的不夠清晰,自己總結一下,僅當做自己學習的記錄(如有誤導、錯誤敬請諒解、指出)。 1.pom.xml中引入支援包: <!-- springboot spring securi

OAuth2.0學習(4-1)Spring Security OAuth2.0 - 代碼分析

endpoint manager authent work cor tro 過程 pro efi 1、org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter

Spring Security 4.x -> 5.x 踩坑記錄

1. AuthenticationManager無法自動注入 在實現AbstractAuthenticationProcessingFilter重寫以使用者名稱、密碼認證時,需要顯示注入AuthenticationManager,不然會報如下錯誤: Caus

視圖框架:Spring MVC 4.0(2)

源碼 resolv pub 發出 variables 不同 圖解 rect js xml 在 《springMVC4(7)模型視圖方法源碼綜合分析》 一文中,我們介紹了ModelAndView的用法,它會在控制層方法調用完畢後作為返回值返回,裏面封裝好了我們的業務邏輯數據和

spring security oauth2.0 實現

規範 ppi basic final pre 代碼 處理 state 三方  oauth應該屬於security的一部分。關於oauth的的相關知識可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.htm

Eclipse Xml編譯錯誤Referenced file contains errors - spring-beans-4.0.xsd

cti con cli ner 但是 per 錯誤 connect 相同 本文轉自:http://josh-persistence.iteye.com/blog/2125420 在eclipse中,有時候在xml文件中,特別是於Spring相關的配置文件中,會出現一些不影響

Spring Security 4.2.3 Filters 解析

其中 validate ali 配置 生命 擁有 path str support 一、 熟悉一個模塊的最快方法 1. 配置logback文件,打印相應的debug信息 2. 根據相應的信息,打斷點查看執行結果 二、spring 使用 DelegatingFilterP

深度學習環境搭建:Tensorflow1.4.0+Ubuntu16.04+Python3.5+Cuda8.0+Cudnn6.0

edi tensor pkgs strong www url 輸出 軟鏈接 5.0 目錄 深度學習環境搭建:Tensorflow1.4.0+Ubuntu16.04+Python3.5+Cuda8.0+Cudnn6.0 Reference 硬件說明: 軟件準備: 1. 安

Spring Tools 4.0.2 釋出,針對 Spring 應用的開發環境

   Spring Tools 4 for Eclipse, Visual Studio Code 和 Atom 的 4.0.2 版本釋出了。Spring Tools 4 是為你量身打造的下一代 Spring 工具,無論你喜歡 Eclipse、Visual Studi

1、基礎部分( Swift 4.0 教程 )

基礎部分(The Basics) 本頁包含內容: Swift 是一門開發 iOS, macOS, watchOS 和 tvOS 應用的新語言。然而,如果你有 C 或者 Objective-C 開發經驗的話,你會發現 Swift 的很多內容都是你熟悉的。 Swift

修改和編譯spring原始碼,構建jar(spring-context-4.0.2.RELEASE)

上週在定位問題的時候,發現有個異常是在spring構建bean的時候丟擲的,為了檢視更詳細的資訊,決定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor類的程式碼,在裡面打

Spring Security(十六):5.7 Multiple HttpSecurity

We can configure multiple HttpSecurity instances just as we can have multiple <http> blocks. The key is to extend the WebSecurityConfi

Spring Security(十五):5.6 Authentication

Thus far we have only taken a look at the most basic authentication configuration. Let’s take a look at a few slightly more advanced options for configurin

Spring Security(十八):5.9 Post Processing Configured Objects

Spring Security’s Java Configuration does not expose every property of every object that it configures. This simplifies the configuration for a majority of

Spring Framework 4.0 遷移指南 (官方文件翻譯)

看到Spring Framework4.0釋出的訊息,看了下new future,OneCoder很喜歡spring這種追“時髦”的風格,groovy指令碼配置和Java8都支援了。順便就翻譯了一下官方的遷移指南。對一般使用來說,遷移沒什麼難度。

upgrade to Spring-Security 4.X後的登入問題

升級到4.2.3後,登入出現 HTTP Status 403 - Could not verify the provided CSRF token because your session was not found sec http裡面需要增加: <sec:hea

Spring Security 4.2.2 一些注意事項

1.配置檔案中的http標籤變為security:http2.security:http上的屬性use-expressions="false",如果未這麼宣告,那麼在子節點中security:intercept-url的access中直接使用角色名,則會報錯Field or

spring4種事務特性,5種隔離級別,7種傳播行為

spring事務: 什麼是事務: 事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗. 事務特性(4種): 原子性 (atomicity):強調事務的不可分割. 一致