详解Spring Security的formLogin登录认证模式
概述
在使用Spring Security开发Web应用的过程中,我们通常需要用户进行身份验证和授权,而Spring Security的formLogin登录认证模式就是其中一种。formLogin认证模式是指用户将会通过一个用户名和密码的表单来进行身份验证。这个过程中,用户在浏览器中访问了一个需要身份验证的页面,但是他们还没有登陆,于是Spring Security自动跳转到一个默认的登录页面(也可以自定义登录页面),并且在用户输入用户名和密码之后进行身份验证。如果验证成功,用户可以访问需要权限的资源,否则将被重定向到错误页面。
使用步骤
下面将会介绍使用formLogin登录认证模式的步骤:
引入Spring Security依赖
在项目的依赖中加入Spring Security的依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.3.2.RELEASE</version>
</dependency>
配置Spring Security
在Spring Security的配置文件中,需要做如下配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true)
.permitAll();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username,password,enabled from users where username=?")
.authoritiesByUsernameQuery("select username,authority from authorities where username=?");
}
}
在上面的配置中,我们定义了需要进行身份验证和授权的页面以及用户的角色和权限。
创建自定义登录页面
如果需要提供一个个性化的登录页面,可以按照如下步骤进行设置:
在Controller中添加以下代码:
@GetMapping("/login")
public String loginPage(){
return "login";
}
在resources/templates目录下新建login.html页面,添加以下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h2>Login Page</h2>
<form action="/login" method="post">
<p>
<label>Username:</label>
<input type="text" name="username"/>
</p>
<p>
<label>Password:</label>
<input type="password" name="password"/>
</p>
<button type="submit">Login</button>
</form>
</body>
</html>
添加用户信息到数据库
首先需要新建两张表,分别保存用户和权限信息:
CREATE TABLE users (
username varchar(50) not null primary key,
password varchar(100) not null,
enabled boolean not null
);
CREATE TABLE authorities (
username varchar(50) not null,
authority varchar(50) not null,
foreign key (username) references users (username)
);
然后插入相应的用户和权限信息:
INSERT INTO users (username,password,enabled) values ('admin','$2a$10$wZRpm94xxWOxJfzy9vwrFOfSdeaoFPAZS9PL.GPEa/gELrOHBzHYW',true);
INSERT INTO USERS (username,password,enabled) values ('user','$2a$10$6tjRQ5tDnoR1ITHcu9l8g.8Ea56F.o7WT.VoieL9D8FiL1S/bajli',true);
INSERT INTO authorities (username,authority) values ('admin','ROLE_ADMIN');
INSERT INTO authorities (username,authority) values ('user','ROLE_USER');
INSERT INTO authorities (username,authority) values ('admin','ROLE_USER');
其中的密码都是使用BCrypt加密,可以使用BCryptPasswordEncoder进行加密。
这里给出的密码是:
admin -> admin
user -> user
运行示例
この操作在示例中运行,构建了一个使用Spring Security formLogin模式进行身份验证的Web应用。其中包含了两张表,一张保存用户信息,一张保存权限信息。每个用户都可以分配多个权限,不同的用户可以访问不同的页面。简单起见,该示例中没有涉及到使用HTTPS。
1. Build and Run
首先,使用下面的命令编译并运行示例:
mvn clean package spring-boot:run
运行成功后,可以通过浏览器访问(http://localhost:8080/)。
2. Login
客户端可以在生成的登陆页面,通过使用上面提到的用户名和密码进行登陆。(管理员用户:admin / admin;普通用户:user / user)。
3. Access
成功登陆之后,我们就能够在不同的URL中对其进行相应的测试:
http://localhost:8080/home
总结
上述是使用Spring Security的formLogin登录认证模式的详细介绍。通过正确使用此模式,我们可以轻松地向我们的Web应用程序添加身份验证和授权用户的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Security的formLogin登录认证模式 - Python技术站