发送请求-------验证资源是否登录才能访问--------注册过滤器---------过滤器--------认证器-------
身份验证管理器(密码验证器)>>>调用认证器-------生成JWT-------控制层-------拦截器-------业务层--------数据访问层
发送请求:每次访问都会尝试带上JWT访问
验证资源是否登录才能访问:
http.csrf().disable();
String[] urls = {
"/admin/login",
"/favicon.ico",
"/doc.html",
"*.js",
"*.css",
"/swagger-resources",
"/v2/api-docs"
};
http.authorizeRequests()
.antMatchers(urls).permitAll()
.anyRequest().authenticated();
注册过滤器:
http.addFilterBefore(过滤器, UsernamePasswordAuthenticationFilter.class);
过滤器:JWT判断
身份验证管理器(密码验证器):验证密码是否正确
Authentication authentication
= new UsernamePasswordAuthenticationToken(
adminLoginDTO.getUsername(), adminLoginDTO.getPassword());
// 执行认证,如果认证失败,将抛出异常
Authentication authenticate = authenticationManager.authenticate(authentication);
认证器:认证该用户的是否可用>>>被身份验证器调用
UserDetails userDetails = User.builder()
.username(admin.getUsername())
.password(admin.getPassword())
.accountExpired(false)
.accountLocked(false)
.disabled(false)
.credentialsExpired(false)
.authorities(admin.getPermissions().toArray(new String[] {}))
.build();
生成JWT:
User user = (User) authenticate.getPrincipal();
log.debug("认证成功,Spring Security返回结果中的getPrincipal():{}", user);
log.debug("Spring Security返回结果中的getPrincipal()的类型:{}", user.getClass().getName());
Map claims = new HashMap<>();
claims.put("username", user.getUsername());
claims.put("permissions", JSON.toJSONString(user.getAuthorities()));
JwtBuilder builder = Jwts.builder();
String jwt = builder
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
.setHeaderParam(Header.CONTENT_TYPE, "HS256")
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 5 * 60 * 60 * 1000))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();



