Springboot Spring-Security JWT 实现用户登录和权限认证

 
更多

引言

在一个基于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();
    }
}

UserControllerAdminController的类上添加@Api注解,用于生成Swagger文档。

最后,在application.yml中添加Swagger的配置:

swagger:
  enabled: true

结语

使用Spring-Security和JWT来实现用户登录和权限认证可以有效地保护我们的Web应用。通过以上步骤,我们创建了一个简单的用户登录和权限认证功能,并使用Swagger来生成API文档。

你可以在GitHub上查看完整的示例代码。

打赏

本文固定链接: https://www.cxy163.net/archives/5941 | 绝缘体

该日志由 绝缘体.. 于 2024年01月09日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Springboot Spring-Security JWT 实现用户登录和权限认证 | 绝缘体
关键字: , , , ,

Springboot Spring-Security JWT 实现用户登录和权限认证:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter