Spring Security提供了三个核心的功能:java
认证(你是谁)spring
受权(你能干什么)浏览器
攻击防御(防止伪造身份)app
在前面的开发中,都是将spring security功能禁用的,如今开启该功能,即在application.properties文件中把下面这句话注释掉便可。ide
# security.basic.enabled=false # 注:在添加了BrowserSecurityConfig以后,security.basic.enabled这个配置就无论用了
重启应用会在控制台输出一个默认密码,对应的用户名是user3d
再访问http://localhost:8080/user/1时会提示输入用户名密码,默认状况下是httpBasic认证.code
认证受权相关的代码写在各个模块里,处理浏览器相关的代码写在imooc-security-browser模块里。写在imooc-security-browser模块里的配置能在demo模块里起做用,缘由是demo中的起动类在com.imooc包下,而BrowserSecurityConfig在com.imooc.security.browser.config包下,注意启动类和配置类所在的包,要否则配置类会不起做用的orm
httpBasic登陆,在imooc-security-browser模块里添加以下配置类,实现了自定义的httpBasic登陆,即默认的认证模式:blog
@Configuration public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { System.out.println("BrowserSecurityConfig"); http.httpBasic() // httpBasic登陆 .and() .authorizeRequests() // 对请求作受权 .anyRequest() // 任何请求 .authenticated(); // 都须要身份认证 } }
httpForm登陆,下面的代码是基于表单的登陆:继承
@Configuration public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { System.out.println("BrowserSecurityConfig"); // 写法一:继承父类是formLogin登陆 // super.configure(http); // 写法二 http.formLogin() // 表单登陆 .and() .authorizeRequests() // 对请求作受权 .anyRequest() // 任何请求 .authenticated(); // 都须要身份认证 } }
最核心的东西就是过滤器链,绿色过滤器可控制,用来处理表单登陆,其余颜色过滤器不可控制,其中蓝色用来处理异常,橙色用来做最终可否访问的认证,REST API就是咱们写的控制器。
请求到UsernamePasswordAuthenticationFilter,会判断是不是登陆请求,是的话是否有用户名和密码并认证,到FilterSecurityInterceptor时会根据配置判断请求是否知足要求(是否已认证或不用认证),若是不知足就返回登陆让用户登陆认证信息。经过在上面几个控制器打断点,来分析一下:
启动应用并访问http://localhost:8080/user/1,首先会FilterSecurityInterceptor.java,对请求作验证,判断没有认证信息后抛出异常
异常信息被ExceptionTranslationFilter.java过滤器捕获并重定向到登陆页面
从控制台复制密码,并在页面输入登陆信息,点击登陆按钮
登陆请求被UsernamePasswordAuthenticationFilter.java过滤器拦截,并对用户信息进行认证
再次被FilterSecurityInterceptor.java拦截器拦截,按F8
最终访问/user/1对应的控制器