常见加密算法:MD5,sha1,sha2
Md5:加密效率非常高,4-6位字符串进行加密加密时间百万分之一秒
Bcrypt:加密效率比较低,4-6位字符串进行加密加密时间需要0.3秒-
需求分析:我们对user用户进行的登陆密码进行加密.
所以我们会用到Bcrpty的密码加密部分.
登陆过程中访问会出现登陆的用户名和密码的页面,这个不是我们所需要的,我们必须放行
步骤:
1、引入springsecurity相关依赖,目的为了适用BcryptPasswordEncoder类 用于加密
2、问题 :默认将用户微服务所有请求拦截
3、解决:提供security配置类将所有请求放行
配置类:
@Component
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
//super.configure(http);
http
.authorizeRequests().antMatchers("/**").permitAll()//放行所有的资源
.and()
.csrf().disable();/*相当
注意:在启动类中添加@bean
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
管理员登陆密码校验
/**
* 用户登录
*/
@PostMapping("/login")
public Result login(@RequestBody Map loginMap){
Admin admin = adminService.findByLoginnameAndPassword(loginMap.get("loginname"), loginMap.get("password"));
//判断
if (admin!=null){
return new Result(true,StatusCode.OK,"登陆成功");
}else{
return new Result(false,StatusCode.LOGINERROR,"用户名或者密码错误");
}
}
/**
* 登陆密码校验
*/
public Admin findByLoginnameAndPassword(String loginname,String password){
Admin admin = adminDao.findByLoginname(loginname);
if (admin!=null&& encode.matches(password,admin.getPassword())){
return admin;
}else {
return null;
}
}
public interface AdminDao extends JpaRepository,JpaSpecificationExecutor{
public Admin findByLoginname(String loginname);
}
用户的登陆和管理员的登陆一样
1.HTTP Basic Auth
HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP BasicAuth
2. Cookie Auth
3. OAuth
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容
4 .Token Auth
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是
这样的:
1. 客户端使用用户名跟密码请求登录
2. 服务端收到请求,去验证用户名与密码
3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里
5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向
客户端返回请求的数据
jwt的组成
1.创建一个工程,导入依赖jjwt
2.编写测试类
public class CreateToken {
/**
* 用户登录成功后,服务型根据用户的登陆信息,产生token,可以设置有效期,得到token
*/
@Test
public void createToken(){
String token = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "itcast")//设置头部信息加密算法
.setIssuer("传智播客")//签发者
.setSubject("jack")//面向用户
.setId("123456")//用户的唯一表示
.setIssuedAt(new Date())//签发时间
.setExpiration(new Date(System.currentTimeMillis() + 300000))//有效期
.claim("role", "admin")//自定义信息
.compact();//将信息压缩成jwt
System.out.println(token);
}
/**
* 验证用户登录的token是否有效
*/
@Test
public void parseToken(){
String token = "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiLkvKDmmbrmkq3lrqIiLCJzdWIiOiJqYWNrIiwianRpIjoiMTIzNDU2IiwiaWF0IjoxNTUwMDYxODQyLCJleHAiOjE1NTAwNjIxNDIsInJvbGUiOiJhZG1pbiJ9.JFgxMUzSCrUtZ4lxP92IV4tXxPr-eyFJJzms_0kqIcc";
//载荷信息
Claims claims = Jwts.parser()
.setSigningKey("itcast")
.parseClaimsJws(token).getBody();
System.out.println(claims);
}
}
需求分析:是微服务的鉴权,同时能够,通过拦截器的形式来,实现token的鉴别
步骤分析:
1.首先编写jwt的工具类,用于创建token和解析token
2.管理员后台签发token
2.1 配置bean jwtUtil
2.2 修改管理员的登陆方法login
3.删除功能的鉴权
3.1 修改状态码 20003 无权访问 约定前端的契约 Bearer+空格token实现
3.2 删除方法中获得请求头 ,判断请求头是否以Bearer开发
4. 因为每个方法中都要写,所以我们编写一个拦截器,实现重复代码的编写
userController中用户登录:
删除用户的用户:
考虑到因为每个方法中都要写解析token的信息,为了让代码更加清爽,我们定义一个拦截器,统一进行而配置
进行配置拦截器:
修改userController中的方法,我们可以进行测试:
登陆admin进行测试删除用户
admin登陆就可以删除成功
相同的操作,我们通过配置拦截器,进行发布信息
1.修改Qaapplication,增添@Bean
2.在而配置文件中增加配置
jwt: ttl: 7200000 signName: itcast
3.添加拦截器类
4.增加配置类applicationConfig
5.修改add方法
只有user用户能发布文章信息