下面我将详细讲解“SpringBoot整合Security权限控制登录首页”的完整攻略,并给出两个示例来帮助理解。
一、准备工作
1.1 引入依赖
首先,我们需要在pom.xml
文件中引入相关依赖:
<!-- Spring Security依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring MVC依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.2 创建登录页面
在src/resources/templates/
目录下创建登录页面login.html
,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<style type="text/css">
div {
margin: 10px 0;
}
</style>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<div>
<label>Username:</label>
<input type="text" name="username">
</div>
<div>
<label>Password:</label>
<input type="password" name="password">
</div>
<div>
<input type="submit" value="Login">
</div>
</form>
</body>
</html>
1.3 配置安全策略
在src/main/java/
目录下创建SecurityConfig.java
文件,代码如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 配置用户数据和权限
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}admin").roles("ADMIN")
.and()
.withUser("user").password("{noop}user").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/index").permitAll() // 不需要权限访问的页面
.anyRequest().authenticated() // 其他页面必须登录才能访问
.and()
.formLogin()
.loginPage("/login") // 指定登录页面的url
.defaultSuccessUrl("/index") // 登录成功之后跳转的url
.permitAll() // 登录页面不需要权限访问
.and()
.logout()
.logoutUrl("/logout") // 注销的url
.permitAll(); // 注销页面不需要权限访问
}
}
二、示例1:普通用户访问需要ADMIN权限的页面
我们来看一个示例:普通用户访问需要ADMIN权限的页面。在src/main/java/
目录下创建IndexController.java
文件,代码如下:
@Controller
public class IndexController {
@GetMapping("/index")
public String index() {
return "index";
}
@GetMapping("/admin")
@ResponseBody
public String admin() {
return "Hello, admin!";
}
@GetMapping("/user")
@ResponseBody
public String user() {
return "Hello, user!";
}
}
现在我们来模拟一下普通用户访问/admin
页面的情景。首先,我们需要在SecurityConfig
中配置相应的权限:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/index").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN") // 需要ADMIN权限才能访问
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/index")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll();
}
接下来我们再来编写一个测试用例来测试一下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IndexControllerTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity()) // 开启Security模拟器
.build();
}
@Test
public void adminTest() throws Exception {
mockMvc.perform(get("/admin"))
.andExpect(status().isForbidden()); // 访问/admin时应返回403 Forbidden
}
}
通过测试用例可以看出,普通用户访问/admin
页面时返回了403 Forbidden
状态码,符合我们的期望。
三、示例2:管理员访问需要ADMIN权限的页面
我们再来看一个示例:管理员访问需要ADMIN权限的页面。在SecurityConfig
中配置管理员角色:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}admin").roles("ADMIN") // 管理员角色
.and()
.withUser("user").password("{noop}user").roles("USER");
}
然后我们来编写一个测试用例来测试一下:
@Test
public void adminTest() throws Exception {
mockMvc.perform(get("/admin").with(user("admin").roles("ADMIN")))
.andExpect(status().isOk()) // 访问/admin时应返回200 OK
.andExpect(content().string("Hello, admin!")); // 正确执行
}
通过测试用例可以看出,管理员访问/admin
页面时返回了200 OK
状态码,并且执行了正确的操作,符合我们的期望。
四、总结
通过以上示例,我们可以看出,通过SpringBoot整合Security可以很方便地实现权限控制和登录功能。需要注意的是,Spring Security提供的默认的登录页面虽然可以使用,但是需要在代码中进行配置,否则无法生效。因此,对于自定义的登录页面,需要使用.loginPage()
方法进行指定。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Security权限控制登录首页 - Python技术站