SpringBoot框架集成token实现登录校验功能

下面是详细讲解SpringBoot框架集成token实现登录校验功能的完整攻略。

一、什么是Token

在Web开发中,服务端不能直接拿到客户端的登录状态,而客户端又需要传递一些数据,这时就需要一种机制来帮助服务端识别客户端的身份,这种机制就是Token。

Token是一种令牌,本质上就是一个字符串,客户端在登录时通过身份验证后,服务端会返回给客户端一个Token,每次客户端请求时都会携带这个Token,服务端通过验证Token来确定客户端的身份。

二、实现步骤

1. 引入依赖

在pom.xml中引入SpringBoot的web和security依赖,以及生成Token所必须的JWT依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- JWT -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

2. 配置拦截器

通过实现HandlerInterceptor接口,实现Token校验的拦截器。

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求头中的Token
        String token = request.getHeader("Authorization");
        if (StringUtils.isNotBlank(token)) {
            try {
                // 验证Token是否正确
                Jwts.parser().setSigningKey("MyJwtSecret").parseClaimsJws(token.replace("Bearer ", ""));
                return true;
            } catch (Exception e) {
                throw new BusinessException("无效的Token");
            }
        } else {
            throw new BusinessException("缺少Token");
        }
    }
}

3. 配置安全认证

WebSecurityConfigurerAdapter中配置UserDetailsServicePasswordEncoder,实现安全认证。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .antMatchers(HttpMethod.POST, "/user").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilterBefore(tokenAuthenticationFilter(), BasicAuthenticationFilter.class);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public TokenAuthenticationFilter tokenAuthenticationFilter() {
        return new TokenAuthenticationFilter();
    }

    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

4. 配置Token生成

在登录成功后,通过JWT生成Token,并返回给前端。

@Service
public class AuthServiceImpl implements AuthService {
    @Override
    public String login(UserDto userDto) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(userDto.getUsername());
        if (userDetails == null || !passwordEncoder.matches(userDto.getPassword(), userDetails.getPassword())) {
            throw new BusinessException("用户名或密码不正确");
        }
        String token = Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 24 * 1000))
                .signWith(SignatureAlgorithm.HS512, "MyJwtSecret")
                .compact();
        return "Bearer " + token;
    }
}

5. 测试接口

编写测试接口,通过Token校验保护接口的安全。

@RestController
public class TestController {
    @GetMapping("/test")
    public String test() {
        return "Hello, World!";
    }

    @PostMapping("/user")
    public String saveUser() {
        return "Save user";
    }
}

三、示例应用

下面是两个简单的示例应用:

示例1:登录成功生成Token

POST /login HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{"username": "admin", "password": "admin"}
HTTP/1.1 200 OK
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyNDUyMzk5MCwiZXhwIjoxNjI0NTMwNjAwfQ.VR1HBXrzr6AAUSI3vAhN8v8RNSj3r4GgUCYDoA9BPrLOTOl8BU-L8ap6lhDcE3YlXxDlOqPSuPTv6NQGCWBIhA

示例2:未传递Token校验失败

GET /test HTTP/1.1
Host: localhost:8080
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8

{"code":400,"message":"缺少Token"}

示例3:传递无效Token校验失败

GET /test HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyNDUyMzU1NCwiZXhwIjoxNjI0NTMwMzU0fQ.sVb6XEBVfSzDpvZirq_JYFmm1MXJhcbtzrlLmdeLZ1x-KCcoy8jPKpXGnwCgdzF3n_h_J-bQrIFV7E9cv0yXzw

HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8

{"code":400,"message":"无效的Token"}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot框架集成token实现登录校验功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 一文详解SpringBoot如何优雅地实现异步调用

    一文详解Spring Boot如何优雅地实现异步调用 在Spring Boot应用程序中,我们经常需要进行异步调用,以提高应用程序的性能和响应速度。本文将详细讲解如何在Spring Boot应用程序中优雅地实现异步调用。 步骤一:添加依赖 我们需要在pom.xml文件中添加以下依赖项: <dependency> <groupId>or…

    Java 2023年5月15日
    00
  • layui table 表格模板按钮的实例代码

    本次我们简单介绍一下“layui table 表格模板按钮的实例代码”的完整攻略。 1. 基础设置 首先,我们需要引入layui框架中的table.js和laytpl.js文件。安装起来方法也非常简单,只需要执行以下代码即可。 <script src="lay/modules/table.js"></script>…

    Java 2023年6月15日
    00
  • 什么是Java安全管理器?

    Java安全管理器是Java运行时环境提供的一种访问控制机制,用于控制Java程序的访问权限。它的作用是为Java程序提供安全保障,限制其对系统资源的访问和操作,保证程序的安全性。 Java安全管理器可以通过在程序运行时设置Java安全策略文件来实现,这个策略文件定义了一组规则,规定了Java程序可以访问哪些资源、以什么方式访问、如何检查访问权限等。通过使用…

    Java 2023年5月11日
    00
  • JavaWeb实现简单的自动登录功能

    JavaWeb 实现自动登录的功能,通常需要将用户登录时输入的用户名和密码保存到浏览器的 Cookie 中,下次用户再次访问网站时,如果本地浏览器保存有对应的 Cookie,则无需再次登录,直接获取用户的登录信息即可。 实现自动登录的具体步骤如下: 在登录时,将用户输入的用户名和密码进行验证,如果验证通过则生成一个唯一的令牌 token,并将该令牌和用户名保…

    Java 2023年6月15日
    00
  • 亲手带你解决Debug Fastjson的安全漏洞

    下面我将为你讲解如何解决Fastjson的安全漏洞。 什么是Fastjson的漏洞? Fastjson是一款被广泛使用的Java JSON解析器和生成器。然而,在Fastjson中存在一些安全漏洞,使得攻击者可以利用它来执行远程代码、绕过安全措施、拒绝服务攻击等。为了保护我们的应用程序免受这些漏洞的影响,我们需要及时采取措施来解决这些漏洞问题。 解决Fast…

    Java 2023年6月15日
    00
  • WEB常见漏洞问题危害及修复建议

    WEB常见漏洞问题危害及修复建议 1. 漏洞问题概述 WEB常见漏洞是指在Web应用程序的设计、开发、运维、维护等各个环节中可能存在的安全隐患。常见的Web安全漏洞有SQL注入、跨站脚本攻击、文件包含漏洞、不安全文件上传、恶意重定向、Session劫持、CSRF攻击等。 这些漏洞问题会造成以下危害: 数据丢失或数据泄露:攻击者可能会利用这些漏洞访问、修改、删…

    Java 2023年6月15日
    00
  • JDK安装配置教程

    JDK安装配置教程 1. 安装JDK 要使用Java开发应用程序,需要先安装Java开发工具包(JDK)。JDK可以从Oracle官网下载,下载地址为:https://www.oracle.com/technetwork/java/javase/downloads/index.html。 根据系统位数选择相应版本的JDK下载,安装程序为exe或dmg(如果是…

    Java 2023年5月26日
    00
  • IDEA2020.1.2创建web项目配置Tomcat的详细教程

    下面给您讲解详细的“IDEA2020.1.2创建web项目配置Tomcat的详细教程”攻略。 步骤一:安装Tomcat 在安装Tomcat之前,必须先确认JDK是否安装成功,因为Tomcat是依赖于JDK的,若JDK未安装则需要先安装JDK。可在官网上下载Tomcat安装包,解压到指定目录即可。 步骤二:创建WEB项目 1.打开Intellij IDEA,选…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部