公司做一个基础的数据平台,有一个功能是整合以前做过的项目。需求:通过基础平台登陆之后点击相应链接可以直接跳转到以前写过项目的首页,并具有一定权限。类似于单点登录。
大致思路
A:基础平台
B:已有的项目
A访问B的首页目录,带一个token参数-------> B拦截地址并获取token------>B带着已接收到的token和A的客户id、客户秘钥主动请求A------>A返回给B一个用户信息------------>B拿着A的用户信息去生成token塞进前端。(具体细节请分析后端代码)
## 前端代码
router.beforeEach((to, from, next) => {
NProgress.start() // start progress bar
//如果拦截到地址参数带有access_token 向后端发请求--->后端主动请求--->得到用户信息生成token塞进前端
if(to.query.access_token!=null){
jieruPingtai(to.query.access_token).then(response => {
store.dispatch('LoginByUser', response).then(() => {
router.push({
path: '/'
})
})
})
}else{
........
LoginByUser({commit}, token) {
return new Promise((resolve, reject) => {
setToken(token);
commit('SET_TOKEN', token);
resolve()
})
}
后端代码
```java
//Service层
//事物回滚,报异常执行
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = Exception.class)
public String getUserToken(String access_token){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String tu = tokenUrl+"?access_token="+access_token+"&client_id="+client_id+"&client_secret="+client_secret;
String str = HttpUtilsAll.doGet(tu);
User user = new User();
Jieshou jieshou = JSONObject.parseObject(str, Jieshou.class);
user.setId(UUIDUtils.generateUuid());
user.setSid(jieshou.getData().getUserId());
user.setUsername(jieshou.getData().getUserName());
user.setName(jieshou.getData().getNickName());
user.setCrtUserName(jieshou.getData().getCreateBy());
user.setTenantId("ac88ceb386aa4231b09bf472cb937c24");
user.setDepartId("3201d74080bf4ac19a48271ca7751d3a");
try {
user.setCrtTime(sdf.parse(jieshou.getData().getCreateTime()));
user.setUpdTime(sdf.parse(jieshou.getData().getCreateTime()));
} catch (ParseException e) {
e.printStackTrace();
}
if(jieshou.getData().isAdmin()){
//如果是管理员,就直接用原有的admin登陆
User admin = mapper.selAdmin();
if(admin!=null){
//根据用户信息生成token
Map<String, String> map = new HashMap<>();
map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(admin.getTenantId()));
map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(admin.getDepartId()));
JWTInfo jwtInfo = new JWTInfo(admin.getUsername(), admin.getId(), admin.getName());
Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
try {
return jwtTokenUtil.generateToken(jwtInfo, map);
} catch (Exception e) {
throw new RuntimeException("token error!");
}
}
}else{
user.setIsSuperAdmin("0");
}
//查询数据库有没有接入平台的用户
User u = mapper.getUserByJieruuser(user.getSid());
//若是不存在接入平台的用户,就先添加用户,并赋一定的权限
if(u==null){
//判断用户名是否存在同样的
User user1 = mapper.selUserByUserName(user.getUsername());
//若存在同样的,就换下用户名再添加
if(user1!=null){
user.setUsername(user.getUsername()+user.getSid());
}
//不一样就直接添加
int n,q;
try {
n = mapper.addUser(user);
}catch (Exception e) {
throw new RuntimeException("用户添加失败");
}
//添加过用户,给用户分组,就会具有一定的权限
if(n>0){
String id = UUIDUtils.generateUuid();
String groupID = "80b2a64addeb4f6788f52b8a52d8f0c3";
try{
q = mapper.addUserIntoGroup(id, groupID, user.getId(), user.getTenantId());
}catch (Exception e) {
throw new RuntimeException("分组添加失败");
}
//添加分组成功,生成token塞进前端
if(q>0){
Map<String, String> map = new HashMap<>();
map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(user.getTenantId()));
map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(user.getDepartId()));
JWTInfo jwtInfo = new JWTInfo(user.getUsername(), user.getId(), user.getName());
Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
try {
return jwtTokenUtil.generateToken(jwtInfo, map);
} catch (Exception e) {
throw new RuntimeException("token error!");
}
}else {
System.out.println("=====接入用户插入组失败=======");
}
}else{
System.out.println("==========添加接入用户失败=============");
}
//存在接入平台用户就直接生成token塞进前端
}else{
Map<String, String> map = new HashMap<>();
map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(u.getTenantId()));
map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(u.getDepartId()));
JWTInfo jwtInfo = new JWTInfo(u.getUsername(), u.getId(), u.getName());
Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
try {
return jwtTokenUtil.generateToken(jwtInfo, map);
} catch (Exception e) {
throw new RuntimeException("token error!");
}
}
return null;
}
注:1.数据库user表添加了一个字段sid,用户接收和判断接入用户的信息
2.this.$store.dispatch .vue里的使用方式 store.dispatch .js里的使用方式
3.如果前端router不是设置成 mode: 'history' 请设置一下,否则拦截不到地址