Spring Security 简介
Spring Security是Spring家族中的一个组成框架,具有强大且高度可定制的身份验证和访问控制功能,致力于为Java应用程序提供身份的验证和授权
(先来一个小案例叭)
本人的环境如下
IDEA:2019.3.5
Maven: 3.6.3
JDK: 1.8
1.创建一个Maven项目 2.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <dependencies> <!--spring boot web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Spring Security--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> 3.创建启动类 @SpringBootApplication public class SecurityApplication { public static void main(String[] args) { SpringApplication.run(SecurityApplication.class, args); } } 4.写一个测试方法(Controller层) @RestController @RequestMapping("/test") public class SecurityController { @RequestMapping("sayHello") public String sayHello() { return "Hello Spring Security"; } }然后我们就可以启动我们的小demo啦,启动的时候输出控制台会打印Spring Security的登录密码(每次启动都会重新初始化),是由UUID生成的,用户名默认是user,输入用户名和密码,登录就成功啦。
5.修改登录的用户名和密码在resources目录下创建一个配置文件application.properties(application.yml),
# 自定义 spring security用户名和密码 spring.security.user.name=huang spring.security.user.password=123456不想要Spring Security的登录也是可以去掉的(关闭验证),只要把Security的自动配置去掉就可以啦,在启动类的@SpringBootApplication注解中添加就好。
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) 6.基于内存的用户信息有时候我们的用户名和密码太多,写在配置文件中不好,可以把用户名和密码保存到内存中进行管理。
1)要写一个配置类一个继承了 WebSecurityConfigurerAdapter抽象类的类,重写它的 config 方法,在方法里面添加用户
//添加为配置类(相当于spring的xml文件) @Configuration //开启Spring Security功能 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //加密 PasswordEncoder pe = passwordEncoder(); auth.inMemoryAuthentication() .withUser("huangxc") .password(pe.encode("123456")) .roles(); auth.inMemoryAuthentication() .withUser("xian") .password(pe.encode("654321")) .roles(); auth.inMemoryAuthentication() .withUser("admin") .password(pe.encode("admin")) .roles(); } }这样当我们启动项目时,就可以使用config方法里面配置的用户名和密码了。如果你的Spring Security版本是5(现在只出到5)的话,是会报错的(java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"),原因是密码不能使用明文的方式,要进行加密。
在配置类中加如下代码进行加密就好,PasswordEncoder是一个接口,有很多加密算法的子类,而 new BCryptPasswordEncoder就是其中一个。
//把方法添加到spring容器中 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } 2)对用户添加角色在项目中,一个用户往往可以具有多个角色的权限,可以在添加用户的时候进行设置,在roles方法中添加角色(可以添加多个),我这里以添加两个为例。
配置类上面添加一个注解
//开启方法级别的认证 @EnableGlobalMethodSecurity(prePostEnabled = true)控制器中写两个方法来测试一下
@RequestMapping("commonUser") //表示这个方法有两个角色 @PreAuthorize(value = "hasAnyRole('admin','normal')") public String commonUser() { return "Hello 只用户normal角色"; } @RequestMapping("adminUser") //表示这个方法只拥有 admin 这个角色 @PreAuthorize(value = "hasAnyRole('admin'") public String adminUser() { return "Hello 用户 admin 和 normal两个角色"; }