📜  使用Java配置的 Spring Security 项目示例(1)

📅  最后修改于: 2023-12-03 15:06:52.578000             🧑  作者: Mango

使用Java配置的 Spring Security 项目示例

Spring Security 是一个强大的安全框架,它提供了身份验证和权限管理功能。其中,身份验证是指确定用户是谁,而权限管理则是确定用户可以访问哪些资源。Spring Security 可以与各种身份验证和授权机制集成,例如 LDAP、数据库和 OAuth。

本文将介绍如何使用 Java 配置 Spring Security,创建一个简单的安全项目。读者应该熟悉 Spring Framework 和 Spring Security 的基础知识。

配置依赖项

首先,我们需要通过 Maven 或 Gradle 将 Spring Security 添加到我们的项目中。在 Maven 中,我们可以将以下依赖添加到 pom.xml 文件中:

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

在 Gradle 中,我们可以将以下依赖添加到 build.gradle 文件中:

implementation 'org.springframework.security:spring-security-web:5.4.1'
implementation 'org.springframework.security:spring-security-config:5.4.1'
配置 Spring Security

接下来,我们需要配置 Spring Security。我们可以创建一个类,并使用 @EnableWebSecurity 注解启用 Spring Security,在此类中配置相关信息。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/dashboard")
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .permitAll();
    }

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

在上述类中:

  • configure 方法配置 HttpSecurity,该对象控制如何保护请求。我们配置一组匹配路径模式和允许所有请求,因为这是一个简单的示例项目。
  • formLogin 方法定义登录表单的相关信息。如果未启用 CSRF 保护,则默认情况下会启用 CSRF 保护。
  • logout 方法定义注销的相关信息。默认情况下,Spring Security 的 CSRF 保护是启用的,因此注销请求需要具有正确的 CSRF 令牌。
  • configureGlobal 方法定义用户身份验证的相关信息。在本例中,我们使用内存进行身份验证。定义了两个用户(user 和 admin),密码都是 password。他们都具有 ROLE_USER 的角色,而只有 admin 用户具有 ROLE_ADMIN 的角色。

请注意,我们使用了 {noop}password,因为 Spring Security 5 引入了对密码编码的支持。在这里,我们只是将它们作为明文密码存储在内存中。

创建登录表单和注销

现在我们已经配置好了 Spring Security,我们需要创建登录表单和注销页面。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Login</title>
</head>
<body>
    <div th:if="${param.error}">
        Invalid username and password.
    </div>
    <div th:if="${param.logout}">
        You have been logged out.
    </div>
    <form th:action="@{/login}" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username" />
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password" />
        </div>
        <button type="submit">Login</button>
    </form>
</body>
</html>

在上述 HTML 文件中,我们定义了一个简单的登录表单。用户名和密码参数将发送到 /login URL 上。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Dashboard</title>
</head>
<body>
    <h1>Welcome!</h1>
    <p>You are logged in as <span th:text="${#authentication.name}"></span>.</p>
    <form th:action="@{/logout}" method="post">
        <button type="submit">Logout</button>
    </form>
</body>
</html>

在上述 HTML 文件中,我们定义了一个简单的仪表板页面。在此页面中,我们欢迎用户登录,并显示他们的认证名称。注销按钮将发送到 /logout URL 上,该 URL 与 SecurityConfig 类中定义的值相对应。

运行应用程序

现在,我们已经配置好了 Spring Security,并创建了登录表单和注销页面。我们可以使用 Spring Boot Run 运行应用程序,并在浏览器中访问 http://localhost:8080/public/dashboard,应该会看到系统自动跳转到 /login。

login-page

输入有效的用户名和密码后,应该可以看到我们的仪表板页面。

dashboard-page

当我们单击注销按钮时,应被重定向到 /login 页面。

结论

在本文中,我们介绍了如何使用 Java 配置 Spring Security,并创建了一个简单的安全项目。我们设置了一个简单的身份验证机制,其中所有的用户名和密码都存储在内存中。但是,Spring Security 还支持其他的身份验证机制,例如基于 JDBC 的身份验证和 LDAP 服务器身份验证。

我们希望这个示例为你提供了有关如何使用 Spring Security 的入门级信息。如果你需要更多的支持,可以参考官方文档或社区资源。