• 【Spring Security】安全框架学习(五)


    2.3.3.3 登陆接口

    接下我们需要自定义登陆接口,然后让SpringSecurity对这个接口放行。

    2.3.2 准备工作 中我们提供了一个jwt工具类,里面有3种重载形式,详情参考之前的源码。如果要使用jwt工具类,jdk1.8以上的版本可能需要导入这三个包 jjwt-api, jjwt-impl, jwt-jackson,jdk1.8一般来说没必要导。

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

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

    package service;
    
    public interface LoginService {
        public ResponseResult login(User user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    package service.impl;
    
    import ...
        
    public class LoginService implements LoginService{
        
        @Autowired
        private AuthenticationManager authenticationManager;
        
        @Autowired
        private RedisCache redisCache;
    
        @Override
    	public ResponseResult login(User user) {
    		//AuthenticationManager authenticate进行用户认证
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationTokena(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);
            Map<String,String> map = new HashMap()<>;
            map.put("token",jwt); 
            
            //把完整的用户信息存入redis,userId作为key
            redisCache.setCacheObject("login:"+userId,loginUser);
    		return new ResponseResult(200,"登陆成功",map);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    这里的代码使用了redis,如果在前面的yaml文件中没有配置的话,这里要记得配置redis和添加对应的依赖,同时也要记得将redis启动。

    package controllerimport...
    
    @RestController
    public class LoginController {
        
    	@Autowired
    	private LoginServcie loginServcie;
        
    	@PostMapping("/user/login")
    	public ResponseResult login(@RequestBody User user){
    		return loginservcie.login(user);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里,其实不用自定义登陆接口,实现认证签发jwt的,默认的认证拦截器,里面的认证成功处理器方法和认证失败处理器方法,是可以被替换的,自定义这两个方法,在那里面做就ok了。

    一些问题的解决方案

    ①在测试工具中测试时返回空白:

    ​ 这里是空白的原因:重写void configure(AuthenticationManagerBuilder auth)方法。

    ②使用的虚拟机的redis:

    ​ 如果使用虚拟机的Redis,可能需要导入连接池依赖。

    ③报错403的原因:

    ​ 403是没有认证成功,说明用户名和密码与数据库不一致,有可能是密码不是bcype加密过的,需要再数据库中存储加密后的密码。或者没有权限,禁止访问,也就是说,你没有相应的权限或角色。

    ④无法访问云服务器的redis:

    ​ 检查linux是否关闭防火墙。

    ⑤接口测试工具报错:

    ​ 测试接口的有错误的,看看是不是requestBody选了text,应该是JSON。

  • 相关阅读:
    [附源码]Python计算机毕业设计Django高校社团管理系统
    联邦学习:多任务思想与聚类联邦学习
    Make.com实现多个APP应用的自动化的入门指南
    Docker 部署nginx记录
    系统架构设计师-数据库系统(1)
    vue164-自定义指令-全局自定义指令
    合并文件解决HiveServer2内存溢出方案
    【小程序】统计字符
    Vue 项目中的自适应布局:px 转换成 vw/vh
    3.NLP基础:文本可视化简述
  • 原文地址:https://blog.csdn.net/qq_38594872/article/details/126562288