一、SpringBoot中集成SpringSecurity
由于项目使用了SpringBoot,所以在项目中集成SpringSecurity十分的简单。只需要引入下面坐标即可:
然后启动项目,在控制台我们能够看到这样一段日志:
引入SpringSecurity之后,我们来随便编写一个Controller:
然后通过浏览器访问这个url,意外发生了:
我们的请求被302到了一个/login页面,然而我们的项目中并没有这个login页面。不用着急,这个就是SpringSecurity的默认行为,当你集成它的那一刻,他就开始守护我们的项目了。默认登录账号为user,而密码就是前面日志中看到的那一串随机生成的字符串。
登录成功后我们就能访问到原来的controller了,是不是很神奇呢。我们只是引入了一个jar包,就多了一个这么牛逼的功能。你一定会思考它是如何工作的。所以在我们更深入的去使用它之前,我觉得最好还是了解一下它的工作原理,不然会很迷的。
二、SpringBoot是如何集成SpringSecurity
因为一个成熟的框架必定涉及到了很多知识,所以一次性就想理清整个框架的来龙去脉基本是不可能的。我们只能通过编程经验慢慢的一点点的发掘框架其中的奥秘。要想了解SpringBoot是如何去工作的,在了解之前我们需要把最起码的相关注解和配置熟悉下。项目基本的配置我在
landexiang:(一)SpringBoot搭建基本后端应用zhuanlan.zhihu.com中已经介绍过了。在这篇文章中我只是简单的提到了@EnableAutoConfiguration这个注解是用来帮我们提供默认配置的,虽然没说错只是介绍的过于简单了。我们来稍微深入的去了解一下这个注解,SpringSecurity是如何被集成到SpringBoot中的奥秘自然而然就会被揭开。
首先来看这个注解的详细内容:
然后看一下@Import注解的内容:
这个注解本身没什么特别的地方,就是一个需要注解在类上的运行时注解,而且只提供了一个属性。不过上面的注释可以给我们提供需要多帮。注释大概意思是:@Import提供了和在xml配置文件中的<import/>标签相同的能力。允许我们导入注解了@Configuration的类,或者是实现了ImportSelector或者ImportBeanDefinitionRegistrar接口的实现类。在spring4.2之前,我们甚至可以导入一个组件类,类似于AnnotationConfigApplicationContext.register方法(这是一个可以动态注册配置类的方法,放个扩展链接)。
使用 Java 配置进行 Spring bean 管理www.ibm.com通过导读注释我们可以了解到@Import注解可以引入多种类,从而实现不同的功能。我们可以看到@EnableAutoConfiguration上的@Import引入了一个AutoConfigutationImportSelector.class的类。找到这个类的所在:
它的顶级接口为
注释大意为:ImportSelectors引入的配置类和普通的@Import注解引入的配置类处理方式一样,但是如果使用DeferredImportSelector也可以使通过selector引入的配置类在其他的所有直接被发现或者被引入@Configuration配置类处理之后进行处理。可能看到这还不是很懂,我们发现DeferredImportSelector是AutoConfigutationImportSelector的直接父级接口,继续看这个提到的DeferredImportSelector配置类上的注释,大意为:这是一种在所有@Configuration的bean被处理之后才运行的特殊的ImportSelector,即前面提到的推迟运行行为。这个类型的selector在我们依靠@Conditional来引入某些配置时尤其有用。实现类也可以另外的实现Ordered接口然后通过使用@Order注解来表明自己的优先级。另外还提供了一个getImportGroup方法,可以提供过滤或者排序的功能。
AutoConfigurationImportSelector类就额外继承了Orderd接口。
另外通过顶级接口ImportSelectors我们可以得出一个结论,这个类主要提供的功能就是selectImports方法,因为顶级接口中只有这一个方法。通过源码看到它返回一个字符串数组,所以我们自然而然会想到应该看下作为实现类的AutoConfigurationImportSelector中的selectImports方法的具体实现:
我们注意到这一行:
一般像这种,参数只传了个类加载器的加载数据函数,通常都具有一些默认行为。可能加载的是默认路径,也可能加载的是指定类,带着我们的推断进入源码:
果不其然,加载的指定路径下的一个配置文件。来看下它的getResources细节,另外值得注意的是debug的过程中这里如果单纯的按F7是无法进入的,需要强制进入,shift + F7,我们可以看到执行加载任务的是RestartClassLoader:
debug显示其父加载器是系统类加载器: