针对项目的安全管理,Spring家族提供了安全框架Spring Security,它是一个基于Spring生态圈的,用于提供安全访问控制解决方案的框架。
Spring Security的安全管理有两个重要概念,分别是Authentication(认证)和Authorization(授权)。其中,认证即确认用户是否登录;授权即确定用户所拥有的功能权限。
1.依赖
org.springframework.boot
spring-boot-starter-security
mysql
mysql-connector-java
5.1.46
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.3
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.security
spring-security-test
test
yml配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///yunhome?seUnicode=true;characterEncoding=UTF-8
username: root
password: root
thymeleaf:
cache: false
2.业务代码
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(){
//跳转index.html
return "index";
}
}
index.html
首页
访问后台
访问前台
工程结构图
3.启动访问
运行启动类,控制台效果如下:
打开浏览器访问:http://localhost:8080/index
说明
在Spring Boot项目中加入spring-boot-starter-security依赖启动器后,Security会 默认提供一个可登录的用户信息,其中用户名为user,密码随机生成,这个密码会随着项目 的每次启动随机生成并打印在控制台上。
输入用户名user和登陆密码
登录成功后,才会进入一开始访问的index.html页面
第二章 自定义用户认证
config包下创建一个配置类 SecurityConfig 继承 WebSecurityConfigurerAdapter 重写 configure(AuthenticationManagerBuilder auth) 方法 配置类上添加@EnableWebSecurity注解,开启安全管理功能,该注解中包含@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override//重写认证方法
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//1.构建密码加密器
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
//2.自定义两个用户信息(曹操,666,房东/大乔,123,租客)
auth.inMemoryAuthentication().
passwordEncoder(encoder).//密码加密
withUser("曹操").
password(encoder.encode("666")).
roles("房东").
and().//添加第二个用户
withUser("大乔").
password(encoder.encode("123")).
roles("租客");
}
}
2、需求
在index.html页面中,房东可以访问后台和前台,租客只能访问前台。
3、添加依赖
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
改造index.html
添加sec名称空间 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-
springsecurity5"
首页
访问后台
访问前台
登录
登录成功之后
表数据
修改表数据
使用加密器对666和123加密:
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String p666 = encoder.encode("666");
String p123 = encoder.encode("123");
System.out.println(p666);
System.out.println(p123);
将控制台输出的密文替换数据库中的原始密码
把打印出的加密密码放在数据库
修改配置类
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired//注入dataSource
private DataSource dataSource;
@Override//重写认证方法
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String p666 = encoder.encode("666");
String p123 = encoder.encode("123");
System.out.println(p666);
System.out.println(p123);
//连接jdbc认证用户信息
auth.jdbcAuthentication().passwordEncoder(encoder).
dataSource(dataSource).
usersByUsernameQuery("select name ,psw ,1 from h_users where name=?")
.authoritiesByUsernameQuery("select name ,role from h_users where name=?");
}
}
说明
方法usersByUsernameQuery(sql)
根据用户名去验证密码;默认查询语句为:
select username,password,enabled from users where username = ?
默认查询三个字段:用户名,密码,是否可用:1 为可用,0为不可用。
方法authoritiesByUsernameQuery(sql)
根据用户名查询权限,默认sql为:
select username,authority from authorities where username = ?
默认查询两个字段:用户名,权限
测试效果:
使用曹操登录
使用貂蝉登录