第6章-密码加密与微服务鉴权JWT

6 - 密码加密与微服务鉴权 JWT
学习目标:
能够使用 BCrypt 密码加密算法实现注册与登陆功能
能够说出常见的认证机制
能够说出 JWT 的组成部分,以及使用 JWT 的优点
能够使用 JJWT 创建和解析 token
能够使用 JJWT 完成微服务鉴权
1 BCrypt 密码加密
1.1 准备工作
任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。
有很多标准的算法比如 SHA 或者 MD5 ,结合 salt( ) 是一个不错的选择。 Spring Security
提供了 BCryptPasswordEncoder , 实现 Spring PasswordEncoder 接口使用 BCrypt
哈希方法来加密密码。
BCrypt 强哈希方法 每次加密的结果都不一样。
1 tensquare_user 工程的 pom 引入依赖
2 )添加配置类 (资源 / 工具类中提供)
我们在添加了 spring security 依赖后,所有的地址都被 spring security 所控制了,我们目
前只是需要用到 BCrypt 密码加密的部分,所以我们要添加一个配置类,配置为所有地址
都可以匿名访问。
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring‐boot‐starter‐security </artifactId>
</dependency>
3 )修改 tensquare_user 工程的 Application, 配置 bean
1.2 管理员密码加密
1.2.1 新增管理员密码加密
修改 tensquare_user 工程的 AdminService
/**
* Created by Administrator on 2018/4/11.
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure ( HttpSecurity http ) throws Exception {
http
. authorizeRequests ()
. antMatchers ( "/**" ). permitAll ()
. anyRequest (). authenticated ()
. and (). csrf (). disable ();
}
}
@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder (){
return new BCryptPasswordEncoder ();
} 1.2.2 管理员登陆密码校验
1 AdminDao 增加方法定义
2 AdminService 增加方法
3 )修改 tensquare_common 工程的状态码类
@Autowired
BCryptPasswordEncoder encoder ;
public void add ( Admin admin ) {
admin . setId ( idWorker . nextId () + "" ); // 主键值
// 密码加密
String newpassword = encoder . encode ( admin . getPassword ()); // 加密后
的密码
admin . setPassword ( newpassword );
adminDao . save ( admin );
}
public Admin findByLoginname ( String loginname );
/**
* 根据登陆名和密码查询
* @param loginname
* @param password
* @return
*/
public Admin findByLoginnameAndPassword ( String loginname , String
password ){
Admin admin = adminDao . findByLoginname ( loginname );
if ( admin!= null && encoder . matches ( password , admin . getPassword ()))
{
return admin ;
} else {
return null ;
}
}
4 AdminController 增加方法
1.3 用户密码加密
1.3.1 用户注册密码加密
4 )修改 tensquare_user 工程的 UserService 类,引入 BCryptPasswordEncoder
/**
* 状态码实体类
*/
public class StatusCode {
public static final int OK= 20000 ; // 成功
public static final int ERROR = 20001 ; // 失败
public static final int LOGINERROR = 20002 ; //***** 用户名或密码错误
*******
}
/**
* 用户登陆
* @param loginname
* @param password
* @return
*/
@RequestMapping ( value= "/login" , method=RequestMethod . POST )
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 , " 用户名或密码错
" );
}
} 5 )修改 tensquare_user 工程的 UserService 类的 add 方法,添加密码加密的逻辑
4 )测试运行后,添加数据
数据库中的密码为以下形式
$2a$10$a/EYRjdKwQ6zjr0/HJ6RR.rcA1dwv1ys7Uso1xShUaBWlIWTyJl5S
1.3.2 用户登陆密码判断
1 )修改 tensquare_user 工程的 UserDao 接口,增加方法定义
@Autowired
BCryptPasswordEncoder encoder ;
/**
* 增加
* @param user
* @param code
*/
public void add ( User user , String code ) {
........
........
........
// 密码加密
String newpassword = encoder . encode ( user . getPassword ()); // 加密后的
密码
user . setPassword ( newpassword );
userDao . save ( user );
}
{
"mobile" : "13901238899"
"password" : "123123" ,
} /**
* 根据手机号查询用户
* @param mobile
* @return
*/
public User findByMobile ( String mobile );
2 )修改 tensquare_user 工程的 UserService 类,增加方法
/**
* 根据手机号和密码查询用户
* @param mobile
* @param password
* @return
*/
public User findByMobileAndPassword ( String mobile , String password ){
User user = userDao . findByMobile ( mobile );
if ( user!= null && encoder . matches ( password , user . getPassword ())){
return user ;
} else {
return null ;
}
}
4 )修改 tensquare_user 工程的 UserController 类,增加 login 方法
4 )使用刚才新增加的账号进行测试,查看返回结果
2 常见的认证机制
2.1 HTTP Basic Auth
HTTP Basic Auth 简单点说明就是每次请求 API 时都提供用户的 username
password ,简言之, Basic Auth 是配合 RESTful API 使用的最简单的认证方式,只需提供
用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被
使用的越来越少。因此,在开发对外开放的 RESTful API 时,尽量避免采用 HTTP Basic
Auth
2.2 Cookie Auth
Cookie 认证机制就是为一次请求认证在服务端创建一个 Session 对象,同时在客户端
的浏览器端创建了一个 Cookie 对象;通过客户端带上来 Cookie 对象来与服务器端的
session 对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候, cookie 会被删
除。但可以通过修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值