使用cmd窗口讲 代码进行上传到gitee(码云)
gitee的上传
首先,先在idea的plugin里下载gitee这个插件
在进行下一步,这里 的邮箱必须要和gitee进行绑定不然会发生报错,无法进行添加 , 最后点击apply右下角的apply
创建并配置本地库
vcs版本控制 vreate Git resporty 创建本地库
这里的目录是一个空目录
在将创建的工程放到gitee的目录中
在这时候工程不会再idea中显示这是需要导入
下面开始一步一步的进行操作
选择工程 ----右键-----Git----add
第一种版本
上面的Git test 就会在下面的红色方框内出现
第二种版本
spring security框架
背景分析
企业中数据是最重要的资源,对于这些数据而言,有些可以直接匿名访问,有些只能登录以后才能访问,还有一些你登录成功以后,权限不够也不能访问.总之这些规则都是保护系统资源不被破坏的一种手段.几乎每个系统中都需要这样的措施对数据(资源)进行保护.我们通常会通过软件技术对这样业务进行具体的设计和实现.早期没有统一的标准,每个系统都有自己独立的设计实现,但是对于这个业务又是一个共性,后续市场上就基于共享做了具体的落地实现,例如Spring Security,Apache shiro诞生了.
为什么使用Spring security
1)功能强大,在Springboot诞生之后在配置方面做了大量的强化
2). Spring security的加密方式;使用(bcrypt)这个对象,底层使用随机盐(随机产生数字或者字符串对密码进行加密)的方式,对密码进行hash不可逆(只能进行加密,几乎不能破解)加密
md5和Spring security加密的区别:
md5中相同的密码底层加密的hash是相同的 ; 而Spring security即使相同的密码加密的hash加密也是不相同的
md5的代码测试
package com.cy.jt;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.util.DigestUtils;
@SpringBootApplication
public class Md5Tests {
@Test
void testMd5Enode(){
//1.定义密码,盐
String password="123456";
//此处的字符串可以是随机写, 只要密码和盐相同hash就相同
String salt="www.tedu.cn";
//2.创建加密对象,对密码和盐进行不可逆hash加密
//md5算法对相同内容加密时都是相同的,并且不可逆
//md5算法对不同内容加密可能会出现相同结果吗?(可能,但几率很小)
String pwd=
DigestUtils.md5DigestAsHex((password+salt).getBytes());
//3.输出加密后的密码
System.out.println(pwd);
//1f6d4c93751108d06b6759c2bc353a34
//1f6d4c93751108d06b6759c2bc353a34
System.out.println(pwd.length());//32位
/**说明:实际项目中md5盐要存储在数据库,登录时会基于用户名,将用户信息查询出来,
并基于属于的密码和数据库查询出盐进行hash md5加密,再与数据库存储的密码进行
比对,比对结果正确,则允许登录*/
}
}
Spring security的代码测试
package com.cy.jt;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootTest
public class BrcyptTests {
@Test
void testBrcyptEncode(){
//1.定义一个密码
String password="123456";
//2.定义加密对象
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
//3.对密码进行加密(对密码基于随机盐进行hash不可逆加密)
String newPwd=encoder.encode(password);
System.out.println(newPwd);//输出加密结果
System.out.println(newPwd.length());//60位长度
//4.对密码进行匹配测试(匹配时底层会对密码再次进行加密)
boolean flag=encoder.matches(password,newPwd);
System.out.println("flag="+flag);
}
}
认证授权分析
用户在进行资源访问时,要求系统要对用户进行权限控制,其具体流程如图所示:
Spring Security 概述
Spring Security 是一个企业级安全框架,由spring官方推出,它对软件系统中的认证,授权,加密等功能进行封装,并在springboot技术推出以后,配置方面做了很大的简化.市场上现在的分布式架构下的安全控制正在逐步的转向Spring Security.
Spring Security 基本架构
Spring Security 在企业中实现认证和授权业务时,底层构建了大量的过滤器.
其中:
绿色部分为认证过滤器,需要我们自己配置,也可以配置过个认证过滤器.也可以使用Spring Security提供的默认认证过滤器.黄色部分为授权过滤器.Spring Security就是通过这些过滤器然后调用相关对象一起完成认证和授权操作.
工程代码的创建
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.cy</groupId>
<artifactId>02-jt-spring-security</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
创建配置文件
在resources目录下创建application.yml文件,并指定服务端口
server:
port: 8080
创建项目启动类
package com.cy.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringSecurityApplication {
public static void main(String[] args) {
SpringApplication.run( SpringSecurityApplication.class, args);
}
}
运行启动类访问测试
第一步:检查控制输出,是否自动生成了一个密码,例如:
Using generated security password: 360123aa-df93-4cd9-bab4-5212af421d2c
执行的结果为下面的网页
这里的 密码将上面的密文粘贴复制即可
在登录窗口中输入用户名user(系统默认),密码(服务启动时,控制台默认输出的
密码),然后点击Sign in进行登录,登录成功默认会出现,如下界面:
由于不能直接输入密文所以可以根据配置文件进行配置密码
编辑登录成功页面(.html文件)
在项目的resources目录下创建static目录,并在此目录创建一个index.html文件,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Login Ok</h1> #login OK是页面登录成功之后展现的内容
</body>
</html>
配置登录密码
第一步:编写一个方法(可以在启动类中调用执行),对一个名文进行加密,在application.xml中的代码 , 例如:
server:
port: 8080
spring:
security:
user:
name: jack
# password: 123456 #这种密码太简单 {这是一种解密的算法}
password: '{bcrypt}$2a$10$FprzGGDTUpXnjfc2VDCnLu6nK8txd9Pxadjdbgdb5knV5Kwmscn36'
在test(测试)类中的代码
package springbootrun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootApplication
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
//此为加密比md5加密要强最终要的一点就是相同的密码也会有不同的密文
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
encodePwd();
}
static void encodePwd(){
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
String password="123456";//明文
String newPwd=encoder.encode("123456");
System.out.println(newPwd);//$2a$10$fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.
}
}
访问的页面
登录成功后进入的页面
其中,{bcrypt}指定了密码加密时使用的算法
第三步:启动服务,重新进行登录测试.
Spring Security 认证实践
Spring Security 授权实践
总结
创建空工程
配置工程(jdk, maven,utf-8)
创建module
添加依赖junit(单元测试)
安装gitee插件
创建本地库(那些事不用上传,一般为空工程的所在位置),配置那些文件不用上传,该文件在.gitee/info/exclude
将项目添加到缓存区提交到本地仓库,分享到远程仓库
常见问题(FAQ)关于gitee
1):gitee的密码忘了
2):项目分享到gitee平台上失败(项目名称,输入的邮箱最好不要有数字的账号)
3):倒入新项目要配置环境(jdk,maven路径)
bug的错误分析
在pom文件中的project标签 中有报错
1):可能有嵌套问题
2):依赖下载不完整
idea缓存file----->invaildate caches/restart
在该地方(maven)有红线,首先确定maven是否配置正确;
导入的Maven项目在maven区没有显示
说明,假如连maven区都没有,例如
FAQ 分析
如何理解认证?(判定用户身份的合法性)
如何校验用户身份的合法性?(用户密码,指纹,刷脸,刷身份证,…)
如何进行身份认证?(自己写认证逻辑,借助框架去写认证逻辑-尊重框架规则)
市场上的认证和授权框架有哪些?(SpringSecurity,Shiro)
为什么会选择SpringSecurity?(功能强大,SpringBoot诞生后在配置方面做了大量的简化)
SpringSecurity中的加密方式你用的什么?(Bcrypt,底层基于随机盐方式对密码进行hash不可逆加密,更加安全,缺陷是慢)
SpringSecurity中你用过哪些API?(BcryptPasswordEncoder,UserDetailService,UserDetail,User,
AuthenticationSuccessHandler,AuthenticationFailureHandler,…)
为什么要进行权限控制?(防止非法用户破坏数据)
SpringSecurity进行权限控制的步骤(@EnableGlobalMethodSecurity,@PreAuthorize)
SpringSecurity在进行认证和授权时可能出现的异常?
SpringSecurity在未认证和未授权的前提下访问授权资源时,出现的异常如何处理?