Spring Security介绍
Spring框架带给了Java春天,但随着Java逐渐再次火了起来,出来了许多优秀的权限管理框架。Shiro和Spring Security无疑是让开发者争议较大的两个框架。
对于Shiro,轻量、易于集成、简单易上手等无疑是它最大的优势。
难道Shiro就没有缺点了吗?当然有,比如对于OAuth2支持不够,同时在Spring生态大火的前提下,Spring Security作为家族中的一员,明显占据着绝对的优势。
简单的说一下Spring Security的老事情。早起有一款框架叫Acegi Security,这款框架基于Spring,可以提供丰富的角色和权限管理。但是由于配置过于复杂,让有些开发者望而却步。后来Acegi Security改名Spring Security,加入了Spring家族的怀抱,配置也简化了许多。但是大家都知道,人嘛,不能比,框架亦是如此,正是因为有Shiro的存在,在配置方面,人们仍认为Shiro是重量级的存在。就在那电光火石之间,Spring Boot横空出世。古人云:”一人得道,鸡犬升天“,Spring Security也因此拔然而起。
核心功能
- 认证:看看你的账号密码对不对
- 授权:看看你具有哪些权限
其实不管是Shiro还是Spring Security,或者还是其他框架,最核心的功能就是认证和授权。
Security初体验
-
首先创建一个Spring Boot项目,引入Spring Security (不要忘记引入Spring Web)
-
编写HelloController
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
-
直接启动Spring Boot,访问http://localhost:8080/hello,这个时候会跳转到login页面。此时url也重定向到了http://localhost:8080/login
-
用户名默认为user,密码的话我们可以去启动日志里查看,Using generated security password后面的c426ead4-1fc2-4fd8-aea4-04ff4af6fc39就是生成的密码。
用户的密码是可以在配置文件中定义默认的密码,但是为什么会生成随机密码呢?在生成密码前可以看到一个类UserDetailsServiceAutoConfiguration(红框上面),这个是Spring Security自动配置类。
当isPasswordGenerated()为true时,就会在日志中输出生成的密码。而此时的User是存在于SecurityProperties.User类中,点进去的会发现默认的用户名是user,密码是默认通过UUID生成的,passwordGenerated 也默认为 true。好家伙,这给安排的明明白白的。
默认密码配置
- 配置文件配置
三位大佬已经帮我们定义好了前缀spring.security
只需要在application.properties配置一下就行了
spring.security.user.name=jerry
spring.security.user.password=javayyds
在SecurityProperties.User类中,properties中配置的name和password通过set方法注入了,同时还把passwordGenerated 属性设为false。
- 配置类配置
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
//密码加密方案
return NoOpPasswordEncoder.getInstance();
}
/*
* withUser(用户名)
* password(密码)
* roles(用户角色)
* and() 多角色设置分割
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("jerry")
.password("javayyds").roles("admin")
.and()
.withUser("tom")
.password("cppyyds").roles("user");
}
}
创建SecurityConfig 配置类继承WebSecurityConfigurerAdapter ,提供一个PasswordEncoder 加密实例,通过@Bean注入。然后重写configure方法,通过 inMemoryAuthentication 来开启在内存中配置user、password和roles。当需要配置多个用户时,需要使用and()。
早期是在XML文件中通过标签来配置,标签有开始就有结束,and 符号相当于就是 XML 标签的结束符,表示结束当前标签,这个时候上下文会回到 inMemoryAuthentication 方法中,然后开启新用户的配置。