引言
在一个基于Springboot的Web应用中,用户登录和权限认证是非常常见的功能。本文将介绍如何使用Spring-Security和JWT(JSON Web Token)来实现用户的登录和权限认证。
1. 引入依赖
首先,在pom.xml文件中引入Spring-Security和JWT的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
2. 配置Spring-Security
在Springboot项目的配置文件application.yml中,添加以下配置:
spring:
security:
user:
name: admin
password: admin
这样配置了一个默认的管理员账号和密码。
接下来,在项目的根目录下创建一个SecurityConfig类,继承自WebSecurityConfigurerAdapter,并添加@EnableWebSecurity注解。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}admin")
.roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and().formLogin()
.and().logout().permitAll();
}
}
在configure(AuthenticationManagerBuilder auth)方法中,我们使用auth.inMemoryAuthentication()来配置了一个内存中的用户,并指定了该用户的角色为ADMIN。
在configure(HttpSecurity http)方法中,我们配置了访问各个URL的权限要求。这里,我们指定了/admin/**路径下的接口只允许ROLE_ADMIN的用户访问,其他接口都需要进行身份验证。
3. 创建登录接口
在com.example.controller包下创建一个UserController类,添加以下代码:
@RestController
public class UserController {
@PostMapping("/login")
public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
// 校验用户名和密码
// ...
// 使用JWT创建Token并返回
String token = createToken(username);
return ResponseEntity.ok(token);
}
private String createToken(String username) {
// 生成JWT Token
// ...
}
}
在login方法中,我们先校验用户名和密码是否正确,然后调用createToken(String username)方法来生成JWT Token,并返回给前端。
4. 验证Token并获取用户信息
在com.example.security包下创建一个JwtAuthenticationFilter类,添加以下代码:
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String header = request.getHeader("Authorization");
if (header != null && header.startsWith("Bearer ")) {
String token = header.replace("Bearer ", "");
// 验证Token并获取用户信息
// ...
// 将用户信息设置到SecurityContext中
// ...
}
filterChain.doFilter(request, response);
}
}
在doFilterInternal方法中,我们使用request.getHeader("Authorization")方法来获取请求头中的Authorization字段,然后校验Token的格式,并从Token中获取到用户的信息。
接下来,在SecurityConfig类中添加以下配置:
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
这样,每次请求进来时,都会先经过JwtAuthenticationFilter,进行Token的验证和用户信息的获取。
5. 创建其他接口
在com.example.controller包下创建一个AdminController类,添加以下代码:
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/dashboard")
public String dashboard() {
return "Welcome to the admin dashboard!";
}
}
这里我们创建了一个/admin/dashboard的接口,只允许ROLE_ADMIN的用户访问。
6. 配置Swagger
在pom.xml文件中引入Swagger的依赖。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
添加SwaggerConfig类,用于配置Swagger。
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Springboot+Spring-Security+JWT API")
.description("APIs for user login and authentication")
.version("1.0")
.build();
}
}
在UserController和AdminController的类上添加@Api注解,用于生成Swagger文档。
最后,在application.yml中添加Swagger的配置:
swagger:
enabled: true
结语
使用Spring-Security和JWT来实现用户登录和权限认证可以有效地保护我们的Web应用。通过以上步骤,我们创建了一个简单的用户登录和权限认证功能,并使用Swagger来生成API文档。
你可以在GitHub上查看完整的示例代码。
本文来自极简博客,作者:樱花飘落,转载请注明原文链接:Springboot Spring-Security JWT 实现用户登录和权限认证
微信扫一扫,打赏作者吧~