Spring Boot整合Spring Security
Spring Boot 整合Spring Security
- 前言
- 项目创建
- 使用
前言
Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。
相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。
自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。
因此,一般来说,常见的安全管理技术栈的组合是这样的:
SSM + Shiro
Spring Boot/Spring Cloud + Spring Security
注意,这只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行的。
我们来看下具体使用。
项目创建
创建一个Spring Boot项目,勾选Web和Security依赖
使用
测试访问
需要输入用户名和密码,用户名默认为user,密码默认为项目启动时由UUID生成的随机字符序列
登录后
同时可以自己设置账号密码
配置文件中设置
spring.security.user.name=root
spring.security.user.password=1234
登录
也可以在java代码中配置,创建一个SecurityConfig类继承自WebSecurityConfigurerAdapter,
在java中配置密码时不加密是不行的,我们需要在Test中生成密码的密文
Test
@RunWith(SpringRunner.class)
@SpringBootTest
public class SecurityApplicationTests {
@Test
public void contextLoads() {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
for (int i = 0; i < 10; i++) {
System.out.println(encoder.encode("123"));
}
}
}
SecurityConfig
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("root").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe").roles("admin")
.and()
.withUser("zhangsan").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi").roles("user");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasAnyRole("admin")
.and()
.authorizeRequests().antMatchers("/user/**").hasAnyRole("user")
.formLogin();
}
}
实现一个Controller用于测试
@RestController
public class HelloController {
@GetMapping("/hello")
public String Hello(){
return "Hello Security !";
}
@GetMapping("/admin/hello")
public String admin(){
return "Hello Admin !";
}
@GetMapping("/user/hello")
public String user(){
return "Hello User !";
}
}
还没有评论,来说两句吧...