目录
在java web工程中,一般使用Servlet过滤器(Filter)对于请求进行拦截,然后在Filter中通过自己的验证逻辑来决定是否放行请求。基于这一原理,常用的SpringMVC实现了自己的拦截器,同样的,Spring Security也是基于这个原理,在进入到DispatcherServlet前就可以对Spring MVC的请求进行拦截,然后通过一定的验证(一般验证用户是否有某个权限、请求类型、请求方式等),从而决定是否放行某个请求。
开始之前
1、Spring Security的主要功能就是通过一定的验证,从而决定是否放行某个请求,可以实现用户访问权限控制,HTTP和HTTPS访问控制、CSRF(跨站点请求伪造)访问控制等;
2、Spring Security的拦截会默认先于其它过滤器之前执行;
3、针对Spring Security,角色权限的命名强制都以"ROLE_"开头且全部大写,比如"ROLE_USER","ROLE_ADMIN",
"ROLE_DBA",当然,角色权限可以任意命名,甚至可以定义一个角色权限为"ROLE_HAHA","ROLE_WUDI"。其提供的方法有的会自动给角色权限加上"ROLE_",这时,就不能给角色权限加上"ROLE_",这里需要注意(后面会提供说明)。
快速开始
1、在Spring Boot项目中引入Spring Security的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、启动注解
官方定义的是:web工程使用@EnableWebSecurity,非web工程可以使用@EnableGlobalAuthentication。而事实上,@EnableWebSecurity已经标注了@EnableGlobalAuthentication(可以点进源码查看)。
所以,只需要在启动类上标注@EnableWebSecurity即可开启Spring Security功能。
3、启动Spring Boot项目
启动Spring Boot项目后,可以在Console里面看到随机生成的秘钥,如下。
随即在浏览器中任意输入一个存在于Spring Boot项目中的url,就会出现一个拦截页面,输入刚刚生成的秘钥即可访问到预期的页面,如下。
4、短板
上述过程暴露了一下问题:
-每次启动都会生成不同的秘钥,造成在访问的过程每次都要输入不同的秘钥,如果丢失又要重启,实在是不方便;
-用户只能使用‘user’账号,无法多样化,不适合构建不同的权限;
-不能自定义自己的验证方式和策略;
-验证界面不美观;
-不能定义哪些url需要验证,哪些不需要;
.....................
为了克服只能使用user+自动生成的秘钥引起的弊端,Spring Security提供了使用内存签名服务、数据库签名服务和自定义签名服务。
使用内存签名服务
顾名思义,就是将用户信息存放在内存中(实际项目都是在数据库中)。相对而言,它比较简单,适合于快速搭建测试环境。
1、继承WebSecurityConfigurerAdapter重写拦截配置
里面有三个常用方法供我们重写,如下。
@Configuration
public class RoleConfig extends WebSecurityConfigurerAdapter {
/**
* <p>用来配置用户签名服务,主要是use