P.16-登录接口代码实现、P.17-测试接口
P.16-登录接口代码实现
自定义登陆接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。
在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。
认证成功的话要生成一个jwt,放入响应中返回。并且为了让用户下回请求时能通过jwt识别出具体的是哪个用户,我们需要把用户信息存入redis,可以把用户id作为key。
创建一个LoginController层定义访问路径
@RestController
public class LoginController {
@Autowired
private LoginServcie loginServcie;
@PostMapping("/user/login")
public ResponseResult login(@RequestBody User user){
//登录
return loginServcie.login(user);
}
}
SecurityConfig
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@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();
}
}
创建LoginServcie和LoginServcieImpl层
public interface LoginServcie {
ResponseResult login(User user);//登录
}
@Service
public class LoginServcieImpl implements LoginServcie {
@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 usetid = loginUser.getUser().getId().toString();
String jwt = JwtUtil.createJWT(usetid);
Map<String, String> map = new HashMap<>();
map.put("token",jwt);
//把完整的用户信息存入redis user作为key
redisCache.setCacheObject("login"+usetid,loginUser);
return new ResponseResult(200,"登录成功",map);
}
}
加解密工具类内有
public static void main(String[] args) throws Exception {
// String jwt = createJWT("123");
Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0ZTQ1OTY1NzdkYWM0NTVhYWE5MGIzY2FmMmQ5ZGE5MiIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTY4MjQxMzkyMywiZXhwIjoxNjgyNDE3NTIzfQ.NwiAzQY_8itMEgniIAQkY3W2FXWKG3uxKgeRLiv_gWs");
String subject = claims.getSubject();
System.out.println(subject);
// System.out.println(jwt);
// System.out.println(claims);
}
P.17-测试接口
运行项目工程
打开Redis和Postman进行测试运行

运行结果

将乱码进行替换到JwtUtil工具类里的

运行出的结果是否是登录的用户id
自定义登陆接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。
在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。
认证成功的话要生成一个jwt,放入响应中返回。并且为了让用户下回请求时能通过jwt识别出具体的是哪个用户,我们需要把用户信息存入redis,可以把用户id作为key。

浙公网安备 33010602011771号