概述
SpringBoot中常见的安全框架有Shiro和Spring Security。Shiro是一种轻量级安全框架,可以独立部署运行,Spring Security,它依赖于Spring框架,是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份认证和授权。
这里提到的两点就是我们学习的内容
- 身份认证
- 授权
开始在SpringBoot项目中使用SpringSecurity
用第08节的项目为基础
- 在项目中引入SpringSecurity依赖,pom.xml增加如下内容
<!-- spring security 安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 就这样,不做任何配置,默认启动项目
可以看到控制台输出一个默认生成的随机密码,此时用户名也是默认的:user
3.访问http://localhost:8080/hello,会跳转到login界面,提需要登录,输入上述用户名和密码
4.登录成功跳转到之前访问的地址
- 以上默认的方式,密码会随每次项目的启动而随机变化,当然不太符合使用习惯,接下来我们做一些配置
在yml配置文件中加入spring security配置信息,如下:
spring:
security:
user:
name: singleZhang
password: 123123
- 按之前的步骤启动项目,输入配置信息中的用户名和密码,同样登录成功。
- 我们来分析一下配置信息的处理过程,进入org.springframework.boot.autoconfigure.security包,查看
SecurityProperties.java源码
@ConfigurationProperties(
prefix = "spring.security"
)
public class SecurityProperties {
public static final int BASIC_AUTH_ORDER = 2147483642;
public static final int IGNORED_ORDER = -2147483648;
public static final int DEFAULT_FILTER_ORDER = -100;
private final SecurityProperties.Filter filter = new SecurityProperties.Filter();
private SecurityProperties.User user = new SecurityProperties.User();
public static class User {
private String name = "user";
private String password = UUID.randomUUID().toString();
private List<String> roles = new ArrayList();
private boolean passwordGenerated = true;
public User() {
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
if (StringUtils.hasLength(password)) {
this.passwordGenerated = false;
this.password = password;
}
}
//..,省略无关代码
public boolean isPasswordGenerated() {
return this.passwordGenerated;
}
}
//...省略后面代码
}
从源码中,可以看到,在读取到spring.security配置信息时候,如果设置了用户密码,那就不使用默认的user和自动生成的密码。
- 接下来,我们不用yml配置文件里的配置,删除掉spring.security配置信息,创建SecurityConfig.java配置类,来配置spring security
- SecurityConfig需要继承WebSecurityConfigurerAdapter
- 并配置BCryptPasswordEncoder密码加密方式的Bean,查看源码,可以知道BCryptPasswordEncoder类是接口PasswordEncoder的实现
- 配置用户名和登录密码,登录密码经过BCryptPasswordEncoder加密
package com.zhlab.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* @ClassName SecurityConfig
* @Description //Security配置
* @Author singleZhang
* @Email 405780096@qq.com
* @Date 2020/11/4 0004 下午 4:23
**/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//我们这里的密码经过BCryptPasswordEncoder加密,这样就能和登录框输入的密码做对比
String pwd = encryptPassword("123123");
auth.inMemoryAuthentication()
.withUser("singleZhang")
.password(pwd).roles("admin");
}
/**
* 加密
* */
private static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
}
- 启动项目访问http://localhost:8080/hello,跳转到登录界面,输入用户名和密码
登录成功后
总结
好了,security的初步使用就先讲到这里,下一节我们需要加入自己自定义的登录界面,以及配合数据库中的用户表来进行登录校验。