限制用户有且只有一个token

项目场景:

限制用户只有一个token. 每次登录成功生成新的token,之前的token应当给予删除

问题描述:

以tp6 为例,登录成功时的cache操作

	/**
     * 登录成功时的token操作
     * @param int $uid
     * @return string
     */
    private function token(int $uid) :string
    {
        // 删除之前的token 保证用户token唯一
        $cache = cache('user_'.$uid);
        cache($cache, null);

        // 生成token
        $token = Str::getUserToken($uid);

        // 记录redis
        cache($token, $uid, 3600*24);
        cache('user_'.$uid, $token);

        return $token;
    }
可以使用Spring Security框架来实现Token验证。首先,需要在pom.xml文件中添加Spring Security依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 然后,在Spring Boot应用程序的主类上添加@EnableWebSecurity注释,以启用Spring Security: ``` @SpringBootApplication @EnableWebSecurity public class MyApp { // ... } ``` 接下来,创建一个继承自WebSecurityConfigurerAdapter的配置类,并覆盖configure(HttpSecurity http)方法,以配置安全性: ``` @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/**").authenticated() .and() .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } } ``` 在上面的配置中,我们禁用了CSRF保护,并配置了一个基于JWT的身份验证过滤器。接下来,我们需要实现JwtAuthenticationFilter类,以验证Token: ``` public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = extractToken(request); if (token != null && validateToken(token)) { Authentication auth = new UsernamePasswordAuthenticationToken(token, null, Collections.emptyList()); SecurityContextHolder.getContext().setAuthentication(auth); } filterChain.doFilter(request, response); } private String extractToken(HttpServletRequest request) { // 从请求头中提取Token String header = request.getHeader("Authorization"); if (header != null && header.startsWith("Bearer ")) { return header.substring(7); } return null; } private boolean validateToken(String token) { // 验证Token有效性 // ... return true; } } ``` 最后,我们需要在控制器中使用@PreAuthorize注释来限制访问: ``` @RestController @RequestMapping("/api") public class MyController { @GetMapping("/hello") @PreAuthorize("hasAuthority('ROLE_USER')") public String hello() { return "Hello, World!"; } } ``` 在上面的示例中,我们使用@PreAuthorize注释来限制只有具有ROLE_USER权限的用户才能访问/hello端点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值