SpringSecurity登陆接口

2023-05-16

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

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

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

@RestController
public class LoginController {

    @Autowired
    private LoginServcie loginServcie;

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


    @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();
    }
}
@Service
public class LoginServiceImpl implements LoginServcie {

    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private RedisCache redisCache;

    @Override
    public ResponseResult login(User user) {
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword());
        Authentication authenticate = authenticationManager.authenticate(authenticationToken);
        if(Objects.isNull(authenticate)){
            throw new RuntimeException("用户名或密码错误");
        }
        //使用userid生成token
        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
        String userId = loginUser.getUser().getId().toString();
        String jwt = JwtUtil.createJWT(userId);
        //authenticate存入redis
        redisCache.setCacheObject("login:"+userId,loginUser);
        //把token响应给前端
        HashMap<String,String> map = new HashMap<>();
        map.put("token",jwt);
        return new ResponseResult(200,"登陆成功",map);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringSecurity登陆接口 的相关文章

  • 设置 edge 浏览器跨域

    执行下面两条命令 xff0c 然后重启edge span class token string 34 C Program Files x86 Microsoft span class token entity title E span dg
  • 最简单的基于FFmpeg的AVfilter例子(水印叠加)

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • FFmpeg源代码简单分析:avio_open2()

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • n6005/n5105在debian11实现jellyfin硬解

    n6005 n5105在debian11实现jellyfin硬解 inter集成显卡debian11默认不支持硬解 xff0c 可按以下方式正确开启 1 环境 软件 delbian11 硬件 n6005 docker环境 安装jellyfi
  • ModuleNotFoundError: No module named 'cv2'

    ModuleNotFoundError No module named 39 cv2 39 解决方法 xff1a pip install opencv python
  • C++实现链表逆序

    链表的结构 lt pre name 61 34 code 34 class 61 34 html 34 gt lt pre name 61 34 code 34 class 61 34 cpp 34 gt struct listnode i
  • 初始化我的archlinux

    初始化我的archlinux 进入tty模式 xff0c ctrl 43 alt 43 f12 设置镜像 sudo vim etc pacman conf 开机archlinuxcn manjaro archlinuxcn The Chin
  • C语言实现Split函数

    借助C语言的动态内存分配 xff0c 实现类似VB中Split函数的效果 结构体介绍 xff1a IString xff1a 参数 str 字符串数组的指针 参数 num 字符串个数 函数介绍 功能 xff1a 按一个字符来拆分字符串 参数
  • openWrt从源码下载到编译(开发环境搭建)

    更新 xff1a 最近openwrt SVN失效了 xff0c 不过官方有新的教程 https wiki openwrt org zh cn doc howto buildroot exigence OpenWrt编译系统 安装 OpenW
  • Linux操作GPIO(文件IO方式)

    首先 xff0c 看看系统中有没有 sys class gpio 这个文件夹 如果没有请在编译内核的时候加入 Device Drivers gt GPIO Support gt sys class gpio sysfs interface
  • 斐讯路由器K2最新刷机教程

    最新版固件无法刷机让人很头疼 xff0c 我们需要先手动降级 xff0c 把固件刷回以前版本 xff0c 再用刷机工具进行刷机 1 登录路由器找到如下界面 下载这个文件SW K2 703004604 V21 4 6 12 bin 在上面界面
  • Linux C Socket UDP编程介绍及实例

    1 UDP网络编程主要流程 UDP协议的程序设计框架 xff0c 客户端和服务器之间的差别在于服务器必须使用bind 函数来绑定侦听的本地UDP端口 xff0c 而客户端则可以不进行绑定 xff0c 直接发送到服务器地址的某个端口地址 框图
  • Base64编码、解码 C语言例子(使用OpenSSL库)

    include lt stdio h gt include lt string h gt include lt unistd h gt include lt openssl pem h gt include lt openssl bio h
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • 解决QCamera使用QCameraImageCapture截图卡顿问题

    卡顿原因 xff1a QCameraImageCapture每次调用capture xff0c 无论你是否输入路径 xff0c 都会将捕获的图片存盘 xff0c 存盘的速度慢导致卡顿 解决思路 xff1a 将捕获的图片输出到内存缓冲区而不存
  • tmux使用手记

    tmux 指令操作 session 会话 xff1a session是一个特定的终端组合 输入tmux就可以打开一个新的session tmux new s session name 创建名为 session name 的 tmux ses
  • Oracle中to_char()函数的用法

    Oracle中to char 函数的用法 日期转换 xff1a to char date 39 格式 39 select to date 39 2005 01 01 39 39 yyyy MM dd 39 from dual select
  • terminator安装及常用操作

    terminator 安装 sudo add span class hljs attribute apt span span class hljs attribute repository span ppa gnome span class
  • 嵌入式硬件开发基础(持续更新)

    电阻 理论基础 电阻的定义 电荷在导体中运动时 xff0c 形成电流 导体中的分子 原子等其他粒子阻碍电荷移动 xff0c 进而阻碍电流这种阻碍作用 xff0c 我们称之为电阻 欧姆定律 经典公式 xff1a I 61 U
  • Hadoop Shell基本操作

    Hadoop Shell 基本操作 任务目标 1 熟练掌握常用的hadoop shell命令 相关知识 调用文件系统 FS Shell命令应使用 hadoop fs lt args gt 的形式 所有的的FS shell命令使用URI路径作

随机推荐