今天分享关于Spring Security在Spring Boot中的整合使用。
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。像所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求(来自官方翻译)。简单地说,原理性知识请看其他的博主,这里我不在详说。emmmmm…
第一步导入jar包,springboot搭建项目,maven管理jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
然后进行简单的测试
编写控制层
/**
* 测试接口
* 通过权限设置访问接口
*/
@RestController
@RequestMapping("/security")
public class SecurityApi {
@GetMapping("/test1")
public Res test1() {
return Res.success("test1....");
}
@GetMapping("/test2")
public Res test2() {
return Res.success("test2....");
}
.....
}
编写Security配置,并添加权限访问
@EnableWebSecurity //开启security
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//重写方法
@Override
protected void configure(HttpSecurity http) throws Exception {
//添加访问权限
http.authorizeRequests()
.antMatchers("/security/test1").permitAll() ///security/test1允许所有人访问
.antMatchers("/security/test2").hasRole("vip1") //用户拥有权限次才能访问
.antMatchers("/security/test3").hasRole("vip2") //用户拥有权限次才能访问
.antMatchers("/security/test4").hasRole("vip3") //用户拥有权限次才能访问
.antMatchers("/security/test5").hasRole("vip4");//用户拥有权限次才能访问
//没有权限自动跳转到登录界面
http.formLogin();
}
}
"/security/test1"接口是所有人都可以访问的,在浏览器中能等到正确的返回值
但是,当我访问其他几个接口时,浏览器就访问不了,提示403没有权限拒绝访问
如果需要访问,就需要给用户进行授权,接下来就开始演示授权功能,同样的在Security配置写认证方法
//认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()//在内存在授权,直接将用户存在内存中,因为我还没去设计数据库,jdbcAuthentication 数据库授权
.withUser("admin1").password("root1").roles("vip1")
.and()//开始拼接下一个
.withUser("admin2").password("root2").roles("vip2")
.and()//开始拼接下一个
.withUser("admin3").password("root3").roles("vip3")
.and()//开始拼接下一个
.withUser("admin4").password("root4").roles("vip4");
}
测试认证功能,在授权中开启了"没有权限自动跳转到登录界面",在登录界面登录设置的用户名和密码,然后会抛出一个错误,这个原因是在设置时是明文密码,没有对密码进行加密,所以在设置时需要对密码进行加密
在认证时进行密码加密,BCryptPasswordEncoder只是其中的一种,官方推荐,也可以使用其他的如MD5
//认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//在内存在授权,直接将用户存在内存中,因为我还没去设计数据库,jdbcAuthentication 数据库授权
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("admin1").password(new BCryptPasswordEncoder().encode("root1")).roles("vip1")
.and()//开始拼接下一个
.withUser("admin2").password(new BCryptPasswordEncoder().encode("root2")).roles("vip2")
.and()//开始拼接下一个
.withUser("admin3").password(new BCryptPasswordEncoder().encode("root3")).roles("vip3")
.and()//开始拼接下一个
.withUser("admin4").password(new BCryptPasswordEncoder().encode("root4")).roles("vip4");
}
重启项目重新测试,然后就能得到对应的返回数据了
关于以上代码,建议大家下载源码,在源码中已经给了很详细的注释了