前端要求:给后台传递账号和密码,后台验证后返回一个token,用于下次登陆使用,前端把token存入头信息
但后台怎么写呢?微服务可以直接校验用户名和密码,生成token,返回给前端,下次前端登陆的时候后台通过token可以跳过账号密码的验证,但,还设计到网关的问题,网关那边我如何拦截?还有其他微服务的认证,以及权限问题,权限我是弄一个单独的表呢?还是可以通过token直接认证呢?以及网关拦截问题,如果没有token,如果有token怎么做?有点迷茫,卡住两天了,给个完整的思路吧,有代码最好啦.
前端传递账号密码,通过网关,认证微服务,认证微服务返回一个token,下次登陆的时候直接放行,以及账号的权限如何设置?
其实jwt框架可以做认证处理,大致实例代码如下,token为前端传递过来的包含账号密码的请求信息,userDetails为你自己后台获取的用户信息,用于和前端中的密码做匹配使用,如果对你有所帮助,望采纳
```java
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken token)
throws AuthenticationException {
if (token.getCredentials() == null) {
logger.debug("token failed: no credentials provided");
throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
}
String presentedPassword = token.getCredentials().toString();
String salt = ((JwtUserDetails) userDetails).getSalt();
// 覆写密码验证逻辑
if (!StringUtils.equals(userDetails.getPassword(),presentedPassword)&&!new PasswordEncoder(salt).matches(userDetails.getPassword(), presentedPassword)) {
logger.debug("token failed: password does not match stored value");
throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
}
}
```
我们那边网关只做登录拦截和全局的请求日志,权限都是业务系统自己实现,认证这些东西,oauth2.0基本就能实现了
第一步,在login中进行登录操作,然后返回一个jwt,前端对这个值进行缓存
第二步,前端调用后端服务是将jwt放到header中
第三步,后端创建一个filter判断请求中是否携带了jwt以及是否有效,如果无效则返回未登录,如果有效则继续执行
网关进行路由,然后认证中心进行生成token和进行验证,可以采用oauth2+jwt来实现,资源中心进行权限验证
建议你去某云上找几个开源项目,平台类型的就行,基本都会带完整的权限管理,说难不难,但也不是几句话能说清的
统一认证和权限管理可以统一成一个微服务,统一网关验证时调该服务的接口
网关拦截所有请求,获取请求头部信息得到token,验证token成功则放行进行业务操作,失败则返回通知前端跳转至登录页。
String token = request.getHeader(AuthCons.CONTEXT_TOKEN);
if (MyUtil.isEmpty(token)) {
token = request.getParameter(AuthCons.CONTEXT_TOKEN);
}
if (MyUtil.isEmpty(token)) {
setFailedRequest(AjaxResultVO.error401(), 200);
log.warn("access token is null !");
return null;
}
if (!JwtUtils.checkJWT(token)) {
setFailedRequest(AjaxResultVO.error401(), 200);
log.warn("access token invalid!");
return null;
}
log.info("access token ok!");
学习了
搜一下cas或者4A,就一大堆