首先,Spring Security 是基于 Spring 框架的安全模块,可以帮助开发者为 Web 应用程序提供安全认证和授权功能。而 Spring Boot 是基于 Spring 框架的快速开发应用程序的框架。结合两者,可以快速搭建安全可靠的 Web 应用。下面,将详细讲解结合的示例:
环境准备
首先,需要准备好以下环境:
- JDK 8 或 11
- Maven 3.2+
- Spring Boot 2.5.5 (最新版本)
- Spring Security 5.x (目前最新版本)
创建项目
1.打开命令行,输入以下命令,创建一个新的 Spring Boot 项目:
$ mvn archetype:generate -DgroupId=com.example -DartifactId=springboot-security-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2.在 pom.xml 中,添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.5.0</version>
</dependency>
</dependencies>
配置 Spring Security
1.创建一个 Spring Security 配置类,实现 WebSecurityConfigurer 接口,示例代码如下:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/", "/home").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
上述代码中,我们配置了以下内容:
- "/login" 页面是所有用户都可以访问的
- "/" 和 "/home" 页面需要有 "USER" 角色的用户才可以访问
- 明确其他所有请求都需要认证才能访问
2.创建一个简单的 Controller,用于展示不同的页面,示例代码如下:
@Controller
public class HomeController {
@GetMapping({"/", "/home"})
public String home() {
return "home";
}
@GetMapping("/login")
public String login() {
return "login";
}
}
创建视图
1.在 /src/main/resources/ 中添加 application.properties 文件:
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
2.在 /src/main/webapp/WEB-INF/views/ 中添加 login.jsp 和 home.jsp 文件。
测试应用程序
运行命令 mvn spring-boot:run 运行整个应用程序,在浏览器中访问页面 http://localhost:8080/login,就可以看到一个简单的登录页面。
输入用户名 "user" 和密码 "password" ,就可以进入首页。如果输入错误的用户名或密码,将会返回到登录页面。
示例二
1.添加用户角色,在 WebSecurityConfig 类的 configureGlobal 方法中:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN");
}
上述代码中,我们新增了一个 "admin" 用户,并为其授予了 "ADMIN" 角色。
2.更新授权访问限制,在 WebSecurityConfig 类的 configure 方法中:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/", "/home").hasAnyRole("USER", "ADMIN")
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
上述代码中,我们针对 "/admin/**" 的路径设置了仅管理员具有访问权限,其余所有 "USER" 和 "ADMIN" 的用户均可访问 "/home" 和 "/" 页面。
使用上述配置和角色,访问 "/admin" 页面将会被拒绝,因为当前用户是 "USER" 角色,而不是 "ADMIN" 角色。
这是一个基础的 Spring Boot 与 Spring Security 的结合示例,你可以使用类似的配置方式根据自己的需求修改。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot与spring security的结合的示例 - Python技术站