提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、Restful是什么?
REST(英文:Representational State Transfer,简称REST)
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
REST 指的是一组架构(约束条件)和原则。满足这些(约束条件)和(原则)的应用程序或设计就是 RESTful。
1.每一个URI代表一种资源,独一无二
2.客户端和服务器之间,传递这种资源的某种表现层
3.客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
具体可见
https://blog.csdn.net/a78270528/article/details/78469758?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
二、SpringSecurity登录配置思路
1、重写UserDetailsService里边的loadUserbyusername方法,通过auth.userDetailsService(userDetailsService)<-放入,这个方法需要passencoder,这个方法通过注入
@Bean
publicPasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();//默认方法
}
2.使用jwt的相应配置
使用Jwt不需要csrf,也不需要session将其都关了
http.csrf()
.disable()
//基于token,不需要session
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
//允许登录访问
.antMatchers("/login","/logout")
.permitAll()
//除了上面,所有请求都要求认证
.anyRequest()
.authenticated()
.and()
//禁用缓存
.headers()
.cacheControl();
3添加jwt 登录授权过滤器
http.addFilterBefore(jwtAuthencationTokenFiliter(),UsernamePasswordAuthenticationFilter.class);
我们要实现这个过滤器
过滤器的实现(1)根据key从请求头里边获取获得 authHeader
(2)根据authHeader判断,拿到jwt令牌
(3)判断的话它是否为空或者请求头一样,然后根据token获取用户名,根据springsecurity判断上下文的登录对象,一定要重新设置登录对象,最后放行
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpRequest;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JwtAuthencationTokenFiliter extends OncePerRequestFilter {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
private JwtTokenUtils jwtTokenUtils;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
String authHeader=httpServletRequest.getHeader(tokenHeader);
//存在token
if(null!=authHeader&&authHeader.startsWith(tokenHead)){
String authToken=authHeader.substring(tokenHead.length());
String username=jwtTokenUtils.getUserNameFromToken(authToken);
//token存在用户名但未登录
if(null!=username&&null== SecurityContextHolder.getContext().getAuthentication()){
//登录
UserDetails userDetails= userDetailsService.loadUserByUsername(username);
//验证token是否有效,重新设置用户对象
if(jwtTokenUtils.validateToken(tokenHead,userDetails))
{
UsernamePasswordAuthenticationToken authenticationToken=new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
}
}
filterChain.doFilter(httpServletRequest,httpServletResponse);
}
}
4.添加自定义未授权和未登录返回结果
括号里面的是自己自定义的类
http.exceptionHandling()
.accessDeniedHandler(restfulAccessDeniedHandler)
.authenticationEntryPoint(restAuthorizationEntryPoint);