首页 > 其他分享 >铺垫知识jwt工具类使用、登录接口实现细节分析和代码实现、测试接口

铺垫知识jwt工具类使用、登录接口实现细节分析和代码实现、测试接口

时间:2023-04-22 15:46:19浏览次数:37  
标签:登录 实现 jwt 接口 user login public

铺垫知识jwt工具类使用

JWT工具类:JWTUtil

  public static void main(String[] args) throws Exception {
        // 加密
        String jwt = createJWT("2123");
        System.out.println(jwt);
        // 解密
        Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJkZjI2MzA3MjY5OTI0MmNhOWY2YWU3OWQzNmJiN2IzOCIsInN1YiI6IjIxMjMiLCJpc3MiOiJzZyIsImlhdCI6MTY4MjE0MzIzNSwiZXhwIjoxNjgyMTQ2ODM1fQ.FGdlJos1XLrYPmP-aoD2ykNBEik4c65dz11KLv6JtlU");
        String subject = claims.getSubject();
        System.out.println(subject);
    }

登录接口实现细节分析和代码实现、测试接口

接下来我们需要自定义登录接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。

在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。

认证成功的话要生成一个jwt,放入响应中返回。并且为了让用户下回请求时能通过jwt识别出具体的是哪个用户,我们需要把用户信息存入redis,可以把用户id作为key。

@RestController
public class LoginController {

    @Autowired
    private LoginService loginService;

    @PostMapping("/user/login")
    public ResponseResult login(@RequestBody User user) {
        // 登录
        return loginService.login(user);
    }
}
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //创建BCryptPasswordEncoder注入容器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();
    }

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

创建LoginService接口

public interface LoginService {
    ResponseResult login(User user);
}

LoginServiceImpl实现类实现LoginService接口

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private RedisCache redisCache;

    @Override
    public ResponseResult login(User user) {
        //AuthenticationManager authenticate进行用户认证
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
        Authentication authenticate = authenticationManager.authenticate(authenticationToken);
        // 如果认证没通过,给出对应的提示
        if (Objects.isNull(authenticate)) {
            throw new RuntimeException("登录失败");
        }
        // 如果认证通过了,使用userid生成一个jwt jwt存入ResponseResult返回
        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
        String userid = loginUser.getUser().getId().toString();
        String jwt = JwtUtil.createJWT(userid);
        HashMap<String, String> map = new HashMap<>();
        map.put("token",jwt);
        // 把完成的用户信息存入redis userid作为key
        redisCache.setCacheObject("login:"+userid,loginUser);
        return new ResponseResult(200,"登录成功",map);
    }
}

postman测试接口的时候需要启动redis,不然会报错

控制台

postman

启动redis服务器之后

标签:登录,实现,jwt,接口,user,login,public
From: https://www.cnblogs.com/wsfj/p/17343178.html

相关文章

  • Java根据ID获取拼多多商品详情 API接口(商品ID、商品标题、价格、原价、昵称、库存、销
    ​ 根据小编对新零售的核心诉求的理解,拼多多其实并不属于新零售实体。而在我国经济红红火火的这个时代,与消费升级并存的对立方向消费降级现象、小镇的中青年的消费偏好、以及一线的消费者复杂甚至相对矛盾的消费特征,和背后由这些消费特征与诉求来决定的电商大格局。Java它是一......
  • 仿chatGPT或chatPDF的前端界面布局,css实现对话聊天布局代码,响应式左右分栏布局(附完整
    chatPDF或者chatGPT的界面挺简洁的,就是一个左侧的列表以及右侧的对话列表,现在使用css实现这样的布局充分运用了flex布局方式实现,左右分栏,以及对话形式展示效果下面是效果图: 在手机设备看就隐藏左侧,右侧100%适应 下面就是html和css的布局代码<style>.chatpdf{......
  • 阿里云1+X云计算开发与运维实战—— 使用负载均衡实现https与http的混合访问
    实验概述    互联网巨头雅虎官方对外发布消息,承认在2014年的一次黑客袭击中,至少5亿用户的数据信息遭窃。此次事件让我们再次意识到网站安全的重要性,网站加密防护的必要性。我们可以使用HTTPS协议对网站进行全站加密,但是,大部分用户已经习惯直接输入域名(即使用 HTTP 协议)访问网......
  • 八大排序算法(c语言实现)
    title:八大排序算法(c语言实现)小知识:1)八大排序算法皆是内部排序。2)稳定的算法在排序的过程中不会改变元素彼此的位置的相对次序。反之不稳定的算法会经常改变这个相对次序。排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性冒泡排序O(n^2)......
  • 牛客网——实现二叉树先序、中序和后序遍历
    title:牛客网——实现二叉树先序、中序和后序遍历题目描述:分别按照二叉树先序,中序和后序打印所有的节点。示例:输入:{1,2,3}返回值:[[1,2,3],[2,1,3],[2,3,1]]备注:$$n\leqslant10^6$$代码如下:(照着别人的代码敲的,待重新实现一遍)/***structTreeNode{* int......
  • 数据库校验用户核心代码实现、用户密码加密存储
    数据库校验用户核心代码实现核心代码实现创建一个UserDetailsService接口,重写其中的方法。更加用户名从数据库中查询信息@ServicepublicclassUserDetailsServiceImplimplementsUserDetailsService{@AutowiredprivateUserMapperuserMapper;@Overrid......
  • chatGPT,该如何使用python调用你的接口
    以下是chatGPT的回答:好的,这里是一些使用Python调用OpenAIAPI的基本步骤:安装openaiPython包您可以使用pip安装openai包。在终端或命令行中输入以下命令:pipinstallopenai获取API密钥在使用OpenAIAPI之前,您需要获得OpenAIAPI密钥。要获得API密钥,请访问OpenAI网......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之003 week01 02-03 代码实现线性查找
    1、算法描述在数组中逐个查找元素,即遍历。2、思路原理如算法描述,基本是最简单的代码块了,没有什么额外的原理。3、初步的代码实现线性查找法初步的代码实现:packagecom.mosesmin.datastructure.week01.chap02;/***@Misson&Goal代码以交朋友、传福音*@ClassNameLinearSearc......
  • 随机数的实现
    针对使用随机数,每次可能出现相同的数,采用以下相对较好的实现方法第1行和第2行是头文件,分别包含了输入输出流和随机数相关的库函数。第4行调用random_device函数创建一个真正的随机数生成器rd,用于生成种子。第5行使用mt19937引擎生成器gen,将上面生成的随机数作为种子。这里使用......
  • bat通过for来实现命令执行结果赋值输出方法
    前提知识点:变量赋值方法:setd=123变量使用方法:echo%d%命令结果赋值不能直接用,只能用for来赋值如:for/F%%iin('time/t')do(sett=%%i)即可将time/t的命令结果赋给变量t结果中如果有空格等分隔符,赋值结果会只为第一段内容,要把结果全赋值,需要加"tokens=\*"如:for/F"t......