Spring Security之简单举例

核心功能

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对应的控制器

相关文章
相关标签/搜索