📅  最后修改于: 2023-12-03 15:06:52.578000             🧑  作者: Mango
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。我们可以创建一个类,并使用 @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");
}
}
在上述类中:
请注意,我们使用了 {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 页面。
在本文中,我们介绍了如何使用 Java 配置 Spring Security,并创建了一个简单的安全项目。我们设置了一个简单的身份验证机制,其中所有的用户名和密码都存储在内存中。但是,Spring Security 还支持其他的身份验证机制,例如基于 JDBC 的身份验证和 LDAP 服务器身份验证。
我们希望这个示例为你提供了有关如何使用 Spring Security 的入门级信息。如果你需要更多的支持,可以参考官方文档或社区资源。