使用 Spring Security 安全保護 Jakarta EE 應用程序

Jakarta EE,Spring Security
Remote
0
11:58 PM · Nov 29 ,2025

1. 概述

在本快速教程中,我們將探討如何使用 Spring SecurityJakarta EE Web應用程序 進行安全保護。

2. Maven 依賴項

我們先來看本教程所需的 Spring Security 依賴項:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.7.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.7.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.7.5</version>
</dependency>

本教程編寫時,Spring Security 的最新版本(5.7.5);如往常一樣,我們可以查看 Maven Central 以獲取最新版本。

3. 安全配置

接下來,我們需要為現有的 Jakarta EE 應用程序設置安全配置:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {

    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withUsername("user1")
            .password("{noop}user1Pass")
            .roles("USER")
            .build();
        UserDetails admin = User.withUsername("admin")
            .password("{noop}adminPass")
            .roles("ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }
}

為了簡化,我們實現了一個簡單的內存身份驗證。用户詳細信息是硬編碼的。

這用於快速原型設計,當不需要完整的持久化機制時。

接下來,讓我們通過添加 SecurityWebApplicationInitializer 類來將安全集成到現有系統中:

public class SecurityWebApplicationInitializer
  extends AbstractSecurityWebApplicationInitializer {

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

此類將確保 SpringSecurityConfig 在應用程序啓動期間加載。 在此時,我們已經實現了 Spring Security 的基本實現。 有了這個實現,Spring Security 默認會為所有請求和路由進行身份驗證。

4. 配置安全規則4. 配置安全規則

我們可以通過創建 SecurityFilterChainbean進一步自定義 Spring Security:

 @Bean
 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     http.csrf()
         .disable()
         .authorizeRequests()
         .antMatchers("/auth/login*")
         .anonymous()
         .antMatchers("/home/admin*")
         .hasRole("ADMIN")
         .anyRequest()
         .authenticated()
         .and()
         .formLogin()
         .loginPage("/auth/login")
         .defaultSuccessUrl("/home", true)
         .failureUrl("/auth/login?error=true")
         .and()
         .logout()
         .logoutSuccessUrl("/auth/login");
     return http.build();
 }

使用 antMatchers()方法,我們配置 Spring Security 允許匿名訪問 /auth/login進行身份驗證其他任何請求。

4.1. 自定義登錄頁面4.1. 自定義登錄頁面

使用 formLogin()方法配置自定義登錄頁面:

http.formLogin()
  .loginPage("/auth/login")

如果未指定此項,Spring Security 將生成一個默認登錄頁面,位於 /login

<html>
<head></head>
<body>
<h1>Login</h1>
<form name='f' action="/auth/login" method='POST'>
    <table>
        <tr>
            <td>User:</td>
            <td><input type='text' name='username' value=''></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type='password' name='password'/></td>
        </tr>
        <tr>
            <td><input name="submit" type="submit" 
              value="submit"/></td>
        </tr>
    </table>
</form>
</body>
</html>

4.2. 自定義着陸頁4.2. 自定義着陸頁

在成功登錄後,Spring Security 會將用户重定向到應用程序的根目錄。我們可以通過指定默認成功 URL 來覆蓋此行為:

http.formLogin()
  .defaultSuccessUrl("/home", true)

通過將 defaultSuccessUrl()方法的 alwaysUse參數設置為 true,用户將始終重定向到指定的頁面。

如果 alwaysUse參數未設置或設置為 false,則用户將重定向到他/她之前嘗試訪問的頁面,然後再提示進行身份驗證。

同樣,我們也可以指定自定義失敗着陸頁:

http.formLogin()
  .failureUrl("/auth/login?error=true")

4.3. 授權4.3. 授權

可以通過角色限制對資源的訪問:

http.formLogin()
  .antMatchers("/home/admin*").hasRole("ADMIN")

非管理員用户嘗試訪問 /home/admin端點時,將收到“訪問拒絕”錯誤。

我們還可以根據用户的角色限制 JSP 頁面的數據。這通過使用 <security:authorize>標籤完成:

<security:authorize access="hasRole('ADMIN')">
    此文本僅對管理員可見
    <br/>
    <a href="<c:url value="/home/admin" />">Admin Page</a>
    <br/>
</security:authorize>

要使用此標籤,我們必須在頁面的頂部包含 Spring Security 標籤庫:

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

5. Spring Security XML 配置

到目前為止,我們已經看過在 Java 中配置 Spring Security 的方法。讓我們來查看等效的 XML 配置。

首先,我們需要創建一個名為 security.xml的文件,該文件位於 web/WEB-INF/spring文件夾中,其中包含我們的 XML 配置。一個這樣的 security.xml配置文件的示例可以在文章末尾找到。

讓我們首先配置身份驗證管理器和身份驗證提供者。為了簡化起見,我們使用簡單的硬編碼的用户憑據:


<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user" 
              password="user123" 
              authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

我們剛剛創建了一個具有用户名、密碼和角色的用户。

或者,我們可以使用密碼編碼器配置身份驗證提供者:


<authentication-manager>
    <authentication-provider>
        <password-encoder hash="sha"/>
        <user-service>
            <user name="user"
              password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f" 
              authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

我們還可以指定 Spring 的 UserDetailsServiceDataSource作為身份驗證提供者。 更多詳細信息可以在這裏找到:這裏

現在我們已經配置了身份驗證管理器,讓我們設置安全規則並應用訪問控制:


<http auto-config='true' use-expressions="true">
    <form-login default-target-url="/secure.jsp" />
    <intercept-url pattern="/" access="isAnonymous()" />
    <intercept-url pattern="/index.jsp" access="isAnonymous()" />
    <intercept-url pattern="/secure.jsp" access="hasRole('ROLE_USER')" />
</http>

在上面的片段中,我們配置了 HttpSecurity使用表單登錄,並設置 /secure.jsp作為登錄成功 URL。 我們授予匿名訪問 /index.jsp"/"路徑。 此外,我們指定,訪問 /secure.jsp應需要身份驗證,並且經過身份驗證的用户應至少具有 ROLE_USER級別權限。

auto-config屬性設置為 true指示 Spring Security 實現默認行為,而我們不必在配置中覆蓋這些行為。 因此,/login/logout將用於用户登錄和註銷,分別使用。 還提供了一個默認登錄頁面。

我們可以使用自定義登錄和註銷頁面、用於處理身份驗證成功和失敗的 URL 來進一步自定義 form-login標籤。 Security Namespace appendix 列出了 form-login(和其他) 標籤的所有可能屬性。 某些 IDE 還可以通過按下 ctrl鍵並單擊標籤來啓用檢查功能。

最後,為了讓 security.xml配置在應用程序啓動期間加載,我們需要將以下定義添加到我們的 web.xml


<context-param>                                                                           
    <param-name>contextConfigLocation</param-name>                                        
    <param-value>                                                                         
      /WEB-INF/spring/*.xml                                                             
    </param-value>                                                                        
</context-param>                                                                          
                                                                                          
<filter>                                                                                  
    <filter-name>springSecurityFilterChain</filter-name>                                  
    <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy</filter-class>     
</filter>                                                                                 
                                                                                          
<filter-mapping>                                                                          
    <filter-name>springSecurityFilterChain</filter-name>                                  
    <url-pattern>/*</url-pattern>                                                         
</filter-mapping>                                                                         
                                                                                          
<listener>                                                                                
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

請注意,在同一 JEE 應用程序中使用 XML 和 Java 兩種基於配置方式可能會導致錯誤。

6. 結論

在本文中,我們看到了如何使用 Spring Security 安全地保護 Jakarta EE 應用程序,並演示了基於 Java 和 XML 的配置方法。

我們還討論了根據用户角色授予或撤銷對特定資源的訪問方式。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.