让我来详细讲解一下SpringBoot和SpringSecurity环境搭建的步骤。
步骤一:创建SpringBoot项目
首先我们需要创建一个SpringBoot项目。如果你已经有了一个SpringBoot项目,你可以跳过这个步骤。
在创建项目时,我们需要选择Spring Web、Spring Security和Thymeleaf这三个依赖。示例代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
步骤二:配置SpringSecurity
在SpringBoot中,我们可以使用注解来配置SpringSecurity。我们只需要在一个类上面加上注解@EnableWebSecurity
,就可以开启SpringSecurity的自动配置了。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/css/**", "/index").permitAll()
.antMatchers("/user/**").hasRole("USER")
.and()
.formLogin().loginPage("/login").failureUrl("/login-error");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
在这里我们配置了两个URL模式的访问规则,一个是针对/css/**
和/index
路径的访问,它们可以被所有访问者访问;另一个是针对/user/**
路径的访问,它只能被拥有USER角色的用户访问。我们还设置了一个自定义的登录页/login
,和一个登录失败者跳转到的URL,这个URL将会在用户输入错误的用户名或密码时被使用。
我们还需要配置一个AuthenticationManagerBuilder来生成一个用户,让SpringSecurity在内存中保存这个用户。在这个例子中,我们创建的是一个名为“user”的用户,他的密码是“password”,并且他的角色是USER。
步骤三:创建登录页和主页
现在,我们需要创建一个登录页面来让用户输入用户名和密码。这里我使用了Thymeleaf模板引擎来创建一个HTML页面,并将它放置在templates目录下的一个名为login.html的文件中。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Login Page</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>
<div class="container">
<div th:if="${param.error}">
Invalid username or password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div class="form-group">
<label for="username">Username:</label>
<input type="text" id="username" name="username" class="form-control" />
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" class="form-control" />
</div>
<button type="submit" class="btn btn-default">Login</button>
</form>
</div>
</body>
</html>
上面的代码中,我们使用了Thymeleaf的语法来生成HTML代码,包含了一个登录表单和两个div标签。在这个界面中,如果你输入错误的用户名或密码,将会在页面上显示“Invalid username or password.”,如果你成功退出登录,页面上会显示“You have been logged out.”
我们还需要创建一个主页,让拥有USER角色的用户可以访问。这里我创建了一个home.html文件,把它放置在templates目录下。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Home Page</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>
<h1>Welcome Home!</h1>
</body>
</html>
步骤四:运行项目并测试
最后一步是运行你的SpringBoot应用程序,然后试图访问路径
http://localhost:8080/
你会被重定向到登录页面。输入用户名“user”和密码“password”,然后点击“Login”按钮。给SpringSecurity一点时间来验证你的登录信息,你最终应该会被重定向到一个名为“home”的页面。
示例说明
示例一:自定义登录URL和验证失败URL
在步骤二中,我们自定义了登录页的URL和验证失败后跳转的URL。如果你想要自定义它们,你只需要在WebSecurityConfig类中的configure()方法中添加以下代码:
@Override
protected void configure(HttpSecurity http) throws Exception {
// 设置登录页面
http.formLogin().loginPage("/login-custom")
// 配置验证失败跳转的页面
.failureUrl("/login-custom?error=true");
}
示例二:使用数据库进行权限验证
默认情况下,Spring Security 使用内存进行用户认证。但是,在实际的生产环境中,我们很少使用内存来保存认证和授权信息。因此,我们通常会使用数据库或LDAP来保存这些信息。
如果你想要使用数据库进行权限验证,你需要做的是:
- 定义一个数据表,保存用户的认证信息和授权信息。
- 配置一个UserDetailsService,用于从数据库中检索用户的认证信息和授权信息。
- 在WebSecurityConfig类中使用
userDetailsService()
方法来配置这个UserDetailsService。
示例代码:
@Autowired
DataSource dataSource;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?")
.authoritiesByUsernameQuery("SELECT username, role FROM user_roles WHERE username=?");
}
在这里,我们使用了一个名为“users”的表来存储用户信息,使用了一个名为“user_roles”的表来存储用户角色信息。我们还通过dataSource()
方法来配置了一个用于读取数据库的数据源。在内部,Spring Security 的 JDBC认证机制将会执行两个查询语句:一个用于验证用户的用户名和密码,另一个用于获取用户的角色。这两个查询语句都会返回一个ResultSet对象,其中包含了用户的信息。
以上就是使用SpringBoot和SpringSecurity进行权限验证的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot + SpringSecurity 环境搭建的步骤 - Python技术站