最近项目中要做与其它平台的集成,而当前框架使用了SpringBoot Security的技术进行的安全验证,所以特意查阅资料做一些了解,然后对其进行改造做单点的接入;
本篇中,先说验证的内容,授权将放到另一篇来说明;
通常,我们写一个控制器,直接访问是没有阻拦的,但同时也就缺少了安全的保障,数据谁都可以访问,谁都可以修改;
于是,在pom.xml文件中增加如下配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
再启动运行,此时会发现,请求会被拦截,跳转到一个登陆页面
其根本原因,是添加了依赖后,启动了安全验证,在程序中增加了一个过滤器链来做验证处理。
对于用户的验证,最关键的就是UsernamePasswordAuthenticationFilter这个过滤器了。那么,想根据实际需求来使用的话,就是对这些过滤器进行配置和调整;
通过调试,可以大致发现几个关键点:
认证UsernamePasswordAuthenticationFilter,通过父类的doFilter开始。调到了本类中的attemptAuthentication方法,即试图去认证;
前面都是取用户名和密码。下面红框里面的是验证的开始。
默认走的验证提供者是DaoAuthenticationProvider这个实例对象
在这个代码逻辑中,会有个找用户的过程
通过用户名找用户,userDatailService对象,默认是使用的
在这个类中,通过接口继承,实现了UserDetailsService接口定义的loadUserByUsername方法,返回的类型是UserDetails。
得到用户信息后,就该返回认证提供对象中,对请求用户与库用户进行比如认证了。
如果通过,就直接向后走,如果不通过就抛异常。而比对密码,采用了 bcrypt 方式
成功之后,创建了一个认证后的UsernamePasswordAuthenticationToken对象
UsernamePasswordAuthenticationToken对象,其实前面也创建过,而后面创建的这个与前面的不同之处在于,前面的是用的两参构造,后面用的是三参构造。出现的不一致现象就是
这个在后面很关键。最后就是将认证后的对象,赋给SecurityContextHolder,理解为安全上下文持有对象吧。到目前,验证基本结束。
小提示:
上面提到的跳到了默认登陆页,用户名为:user 密码为:运行时,在控制台输出的一行字符串,通过这个密码,即可登陆;
登陆后,再访问相关的地址就能直接通过了。因为它内部采用了session机制对当前用户进行了缓存。