关于session和token的使用,网上争议一直很大。
总的来说争议在这里:
session是空间换时间,而token是时间换空间。session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占用空间.
sessionId失效问题和token内包含。
session基于cookie,app请求并没有cookie 。
token更加安全(每次请求都需要带上)。
开始正文了...
本文大概流程:
oauth2流程简介
我在这里只介绍常用的密码授权。
Oauth2 密码授权流程
在oauth2协议里,每一个应用都有自己的一个clientId和clientSecret(需要去认证方申请),所以一旦想通过认证,必须要有认证方下发的clientId和secret。
原理这块确实很麻烦,希望不理解的多看看参考文档。
1. pom
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
2. 项目架构介绍
我们需要这七个类来完成。
3. UserDetail实现认证第一步
MyUserDetailsService.java
/**
* Created by Fant.J.
*/
@Component
public class MyUserDetailsService implements UserDetailsService {
@Reference(version = "2.0.0")
private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String passwd = "";
System.out.println("收到的账号"+username);
if (CheckFormat.isEmail(username)){
passwd = userService.selectPasswdByEmail(username);
}else if (CheckFormat.isPhone(username)){
passwd = userService.selectPasswdByPhone(username);
}else {
throw new RuntimeException("登录账号不存在");
}
System.out.println("查到的密码"+passwd);
return new User(username, passwd, AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));
}
}
这里重写了security认证UserDetailsService 的接口方法,添加了自定义数据库密码的查询和校验。
为什么我把它放在了controller包了呢,因为我用的dubbo,@Reference注解扫描包是controller。这注解在别的包下失效。没搞过dubbo的朋友就把它当作是调用service层就行。
4. 认证成功/失败处理器
这部分在security的整合(一)就有,这里稍有改动。
改动一:去掉了返回view还是json的判断,统一返回json。
改动二:修改登