十次方day06(密码加密与微服务鉴权JWT)

一.Bcrpty密码加密

常见加密算法: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();/*相当<security:csrf enable=false*/
    }
}

注意:在启动类中添加@bean

@Bean
	public BCryptPasswordEncoder bCryptPasswordEncoder(){
		return new BCryptPasswordEncoder();
	}

管理员登陆密码校验

/**
	 * 用户登录
	 */
	@PostMapping("/login")
	public Result login(@RequestBody Map<String,String> 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<Admin,String>,JpaSpecificationExecutor<Admin>{
    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的Token认证机制

jwt的组成

 

四.java的JJWT实现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登陆就可以删除成功

六.发布信息验证Token

相同的操作,我们通过配置拦截器,进行发布信息

1.修改Qaapplication,增添@Bean

2.在而配置文件中增加配置

jwt:
  ttl: 7200000
  signName: itcast

3.添加拦截器类

4.增加配置类applicationConfig

5.修改add方法

只有user用户能发布文章信息

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的小巍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值