Security的入门和流程分析
问题:访问一个controller方法之前进行一个权限验证?
在controller里面的每一个handler无论什么访问都要进行一个校验,但是对于login logout 验证码这种Handler处理器是放行的
1.使用过滤器+拦截器 注意两者区别
过滤器(Filter)和拦截器(Interceptor)都是用于处理请求和响应的组件,它们的区别主要在于它们作用的层次和执行时机。
过滤器(Filter):
- 作用层次:在Servlet规范中,过滤器是在Web服务器和Web应用程序之间的层次上工作的,主要用于处理HTTP请求和响应。
- 执行时机:在请求的进入和响应的离开阶段都可以执行过滤操作。
拦截器(Interceptor):
- 作用层次:拦截器通常在应用程序框架层次上工作,例如在Spring框架中。它们用于拦截和处理方法调用、请求处理等。
- 执行时机:在方法调用前后、请求处理前后等关键点上执行,更加细粒度地控制请求的处理过程。
创建一个过滤器类,实现
javax.servlet.Filter
接口。在doFilter
方法中添加权限验证的逻辑。public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤器权限验证逻辑 // 如果是登录、登出、验证码等处理器,放行 // 否则进行权限验证 chain.doFilter(request, response); // 继续请求链 } // 其他 Filter 接口方法,如 init 和 destroy,可以留空 } SpringMvc流程:(本质用来处理用户的请求并进行·处理)加一个校验 (假设执行所有方法之前)
拦截器在方法执行之前执行
过滤器只要访问了我的web容器就执行
Spring MVC的简要流程如下:
请求到达DispatcherServlet: 所有的请求首先由前端控制器
DispatcherServlet
接收。Handler Mapping:
DispatcherServlet
通过HandlerMapping
查找请求对应的处理器(Controller)。 IOC/AOP ->SpringHandler Execution: 找到合适的处理器后,执行相应的方法。
ModelAndView: 处理器返回一个
ModelAndView
对象,其中包含模型数据和视图名称。View Resolver:
DispatcherServlet
通过ViewResolver
解析视图名称,获取视图对象。View Rendering: 视图对象负责渲染模型数据,生成最终的响应结果。
返回响应:
DispatcherServlet
将最终的响应发送给客户端。2. 创建拦截器
创建一个拦截器类,实现 Spring 的
HandlerInterceptor
接口。在preHandle
方法中添加权限验证的逻辑。public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 拦截器权限验证逻辑 // 如果是登录、登出、验证码等处理器,放行 // 否则进行权限验证,返回 true 表示继续执行,返回 false 表示拦截请求 return true; } // 其他 HandlerInterceptor 接口方法,可以留空 } 3. 配置过滤器和拦截器
在你的应用程序配置中,配置过滤器和拦截器,并指定它们的拦截/过滤路径以及放行路径
@Configuration public class AppConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter()); registrationBean.addUrlPatterns("/secure/*"); // 设置过滤路径 return registrationBean; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor) .addPathPatterns("/secure/**") // 设置拦截路径 .excludePathPatterns("/login", "/logout", "/captchaImage"); // 设置放行路径 } }方法一:过滤器做放行(/login) 拦截器做校验判断
方法二: 使用springsecurity(优化之前的方式) -> 专门用于处理认证和授权
第一步配置:
?No Ideal
这个Spring整合SpringSecurity的案例解释一下
这两个方法的的调用还是不理解 为啥我就不用手动调用了
1.系统启动的时候Springsecurity做了什么事情?
在Spring的初始化中完成了对SpringSecurity的配置文件的加载解析操作。
Springboot的执行流程:
1.new一个SpringApplication 2.RUN 分两部分
过滤器:看过滤方法就行 init() doFilter() destory()
:IOC容器
SpringSecurity必须依赖Spring
有请求:开始过滤dofilter() 最终去web容器找过滤器
DelegatingFilterproxy在初始化的时候,从容器中根据名称和类型从IOC容器中取到了FiterChainProxy对象,该对象肯定是在SpringSecurity的初始化操作时创建的
SpringSecurity在初始化的时候->根据我们这个配置代理过滤器名称 从IOC容器中拿到DelegatingFilterproxy对象
走完init->走doFilter
NO ideal??
代理过滤器 从IOC容器里面获取FilterChainProxy->在过滤器里面帮你初始化一组过滤器链然后真正处理请求走过滤器链 认证走拦截器
demo
/
整个流程:
必须加密 ->把东西加到IOC容器当中这是需要的
Bad credentials
test1
1234
No Ideal??
LoginUrlAuthenticationEntryPoint的commence方法:方法的执行时机???
登录controller:
登录实现类Impl:
写完一个功能 merge到主线
从controller --> 到...ByLoadNameAndPassword()方法
@Componnets不可以搞源码哦
注入问题:
read-only不能加@Bean标签
方法二:
注入成功之后:
传Authentication接口的子类的实现类
登出实现类Impl:
认证流程
用户详情实现类:
账号密码 --> 存入ThreadLocal中
获取user对象(通过工具类)
String username = AuthenticationContextHolder.getContext().getName();//拿到用户名
String password= AuthenticationContextHolder.getContext().getPassword();//拿到密码
JsonIgnore:序列化操作忽略Security的入门和流程分析
swagger:接口规范的api有关 -> controller中的RquestMapping("url")