springboot整合spring security 实现用户登录注册与鉴权全记录
时间: 2023-10-09 14:15:19 浏览: 133
SpringSecutiry实现认证授权功能,整合SpringBoot
1. 引入依赖
在pom.xml文件中引入Spring Security依赖:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
```
2. 添加配置类
在项目中添加一个配置类SecurityConfig,继承自WebSecurityConfigurerAdapter。
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login", "/register").permitAll() // 登录注册页面不需要验证
.anyRequest().authenticated() // 其他页面需要验证
.and()
.formLogin()
.loginPage("/login") // 登录页面
.defaultSuccessUrl("/index") // 登录成功后的默认跳转页面
.and()
.logout()
.logoutUrl("/logout") // 退出登录的URL
.logoutSuccessUrl("/login") // 退出登录后跳转到的页面
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID");
}
@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");
}
}
```
3. 实现登录与注册功能
创建登录页面login.html和注册页面register.html,使用Thymeleaf模板引擎渲染页面。
在Controller中添加登录和注册的请求处理方法。
```
@Controller
public class UserController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String loginSuccess() {
return "redirect:/index";
}
@GetMapping("/register")
public String register() {
return "register";
}
@PostMapping("/register")
public String registerSuccess() {
return "redirect:/login";
}
}
```
4. 实现用户鉴权功能
在SecurityConfig中重写configure(AuthenticationManagerBuilder auth)方法,实现用户信息的认证。
这里使用inMemoryAuthentication()方法在内存中存储用户信息,实际应用中可以使用数据库存储。
```
@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");
}
```
在Controller中添加需要鉴权的请求处理方法,并在方法上添加@PreAuthorize注解指定需要的权限。
```
@Controller
public class UserController {
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public String admin() {
return "admin";
}
@GetMapping("/user")
@PreAuthorize("hasRole('USER')")
public String user() {
return "user";
}
}
```
5. 配置登录认证
在SecurityConfig中重写configure(HttpSecurity http)方法,配置登录认证信息。
```
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login", "/register").permitAll() // 登录注册页面不需要验证
.anyRequest().authenticated() // 其他页面需要验证
.and()
.formLogin()
.loginPage("/login") // 登录页面
.defaultSuccessUrl("/index") // 登录成功后的默认跳转页面
.and()
.logout()
.logoutUrl("/logout") // 退出登录的URL
.logoutSuccessUrl("/login") // 退出登录后跳转到的页面
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID");
}
```
6. 测试
启动应用,在浏览器中访问http://localhost:8080/login,输入用户名和密码进行登录,登录成功后跳转到首页。
访问http://localhost:8080/admin和http://localhost:8080/user,根据用户角色的不同,页面会有不同的显示。如果访问没有权限的页面,会自动跳转到登录页面。在登录状态下访问/logout可以退出登录。
阅读全文