Spring Security

  1. 1. Spring Security Study
    1. 1.1. 两个重要概念
    2. 1.2. “无差别”保护
    3. 1.3. Form Login

Spring Security Study

收录学习Spring Security的经验踩过的坑

Spring Security相关Maven / Gradle依赖就不说

本文仅适用Web,何苦折磨自己用Spring写非Web项目

使用Spring Security最基本,也是最重要的就是WebSecurityConfigurerAdapter这个抽象类。

其中方法很多,但是初学就不用管那么多了。只需要记住三个常用的即可。

1
2
3
4
5
6
7
8
9
protected void configure(HttpSecurity http) throws Exception{

}
protected void configure(AuthenticationManagerBuilder auth) throws Exception{

}
public void configure(WebSecurity web) throws Exception{

}

两个重要概念

区分两个概念,也是安全认证的两个核心概念:

  • Authentication 认证

Authentication验证用户身份。而一般而言,验证用户身份最简单的方法就是通过帐号密码。

  • Authorization 授权

Authorization鉴别用户权限。一般现代应用,不会所有用户都有所有权限。都是狗管理还玩个屁。所以在认证过后还需要有一步称为鉴权。即获取用户权限,从而判断其是否能够访问请求的资源。

“无差别”保护

总体而言,这是最简单的一个。

重写configure(HttpSecurity http)这个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
protected void configure(HttpSecurity http) throws Exception {

// http.authorizeRequests().anyRequest().permitAll();

// ban the cross origin function
http.cors().disable().csrf().disable();

// Set session management to stateless
http = http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and();

// filter authorize requests
http.authorizeRequests()
.antMatchers("/user/login").permitAll()
.anyRequest().authenticated();

http.authorizeRequests()
.antMatchers("/admin").hasIpAddress("127.0.0.1");
}

以上代码中依此讲解:

authorizeRequests()开头是因为在Spring Security中任意访问均视为带权限访问。也好理解,认证、鉴权,最终一个资源是否允许访问,取决于是否拥有相关权限。认证都没过也就无所谓鉴权了。

  • http.authorizeRequests().anyRequest().permitAll();

    Spring的一大优点便是易读。上面语句的作用即为允许对任意资源的访问。相当于禁用了Spring Security。至于问我为什么不用application.properties,别问,问就是新版本不支持。

  • http.cors().disable().csrf().disable()

字面意思,禁用cors和csrf。即禁用跨域、跨站访问。

至于这俩是啥,以后再补(((

  • http = http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and();

    禁用Session。

    至于为什么要and(),以后再研究

  • http.authorizeRequests().antMatchers("/user/login").permitAll().anyRequest().authenticated();

    antMatchers()即匹配请求URI,带参与否均可。permitAll()即为通过所有对该资源的请求。

    anyRequest().authenticated()即除了上述,其他任何请求都需要认证。而不需要鉴权。

  • http.authorizeRequests().antMatchers("/admin").hasIpAddress("127.0.0.1");

    即对“/admin”的请求需要指定IP,而还有一个hasRole()为需要指定权限,即需要鉴权这一操作。下面再讲。

Form Login