SpringSecurity详解
- 导入SpringSecurity依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 自定义类SecurityConfig,继承WebSecurityConfigurerAdapter
- 添加注释@EnableWebSecurity 重写对应方法
package com.zhou.springbootsecurity.config;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
//AOP 类似于拦截器
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//链式编程
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页所有人能访问 但是功能页面只有有对应权限的人才能访问
// 403 权限不允许
// 请求授权的规则
http.authorizeRequests().
antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
// 没有权限默认回到登录页面
http.formLogin();
}
// 认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 从内存中读 来匹配用户名和密码 当然也可以从数据库中读
// PasswordEncoder密码编码错误 也就是需要加密
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("zhou").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
.and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
.and()
.withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
}
}
SpringBoot特点
1 依赖管理
- 父项目做依赖管理
<!-- 1.引入父子工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
上面的父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
几乎声明了开发中所有依赖包的版本号
- 开发导入starter场景启动器即可
spring-boot-starter-* *代表某种场景
只要引入了starter,这个场景的所有常规需要的依赖我们都自动引入
thirdpartyproject-spring-boot-starter.还可以自定义第3方 的starter
- 可以自动版本仲裁 当然也可以修改版本号
在pom.xml中增加配置
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
2 自动配置
- 自动配置好tomcat
引入tomcat包 配置tomcat- 自动配好springMVC的全套组件、web常见功能
package com.zhou.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/*
主程序类
* @SpringBootApplication告诉它这个是一个SpringBoot应用
* */
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 常看容器里面的组件
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
}
}
- 默认的包结构
主程序所在的包及其下面的所有子包里面的组件都会默认扫描,无需配置以前的包扫描
org.springframework.boot
spring-boot-autoconfigure
2.3.12.RELEASE
按需加载配置,有关配置功能的包在spring-boot-autoconfigure里面
底层注解@Configuration详解
作用
- 告诉springboot这是一个配置类 约等于以前的bean.xml,在里面可创建对象
package com.zhou.boot.config;
import com.zhou.boot.pojo.Pet;
import com.zhou.boot.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //告诉springboot 这是一个配置类 ==beans.xml配置文件
public class MyConfig {
@Bean //给容器添加组件 方法名就是组件id,返回类型就是组件类型 返回的值就是组件在容器中的实例
public User user01(){
return new User("zhangsan",12);
}
@Bean("zhoudage")//自定义id号 取代了cat这个名字
public Pet cat(){
return new Pet("tomcat");
}
}
- 配置类中使用@Bean标注在方法上给容器注册组件,默认是单实例
package com.zhou.boot;
import com.zhou.boot.pojo.Pet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/*
主程序类
* @SpringBootApplication告诉它这个是一个SpringBoot应用
* */
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
/*// 常看容器里面的组件
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}*/
// 从容器中获取组件
Pet z1 = run.getBean("zhoudage", Pet.class);
Pet z2 = run.getBean("zhoudage", Pet.class);
System.out.println(z1.hashCode()+" "+z2.hashCode());
// -868129409 -868129409 hashCode值一样
}
}
- 配置类本身也是组件 要用类模板对象获得
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println(myConfig);
//com.zhou.boot.config.MyConfig$$EnhancerBySpringCGLIB$$d6a490a2@15fc442
- @Configuration(proxyBeanMethods = true) 代理bean的方法,外部无论对配置类中这个组件祖册方法调用多少次获取的都是之前注册容器中的单实例方法
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println(myConfig);
//com.zhou.boot.config.MyConfig$$EnhancerBySpringCGLIB$$d6a490a2@15fc442
Pet c1 = myConfig.cat();
Pet c2 = myConfig.cat();
System.out.println(c1.hashCode()+" "+c2.hashCode());
// -868129409 -868129409
改为false之后就不是单实例了,默认为true
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
ImportResource导入原来的spring配置文件
@ImportResource(“classpath:beans.xml”)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 实体类的名字 类所在的包-->
<bean id="zhang" class="com.zhou.boot.pojo.User">
<property name="name" value="zhangsan" ></property>
<property name="age" value="12"></property>
</bean>
<bean id ="li" class="com.zhou.boot.pojo.Pet">
<property name="name" value="tomcat">
</property>
</bean>
</beans>
如何将properties配置文件中类的属性值整合放到IOC容器中
package com.zhou.boot.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.ImportResource;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
//只有在容器中的组件才能有spring提供的强大功能
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String name;
private int price;
}
@RestController
public class HelloController {
// 从容器中自动获得
@Autowired
Car car;
@RequestMapping("/car")
public Car getCar(){
return car;
}
上面的@Component功能和
@EnableConfigurationProperties(Car.class)
//开启Car配置绑定功能
功能相似