关于java认证登陆的问题

问题遇到的现象和发生背景

前端要求:给后台传递账号和密码,后台验证后返回一个token,用于下次登陆使用,前端把token存入头信息

问题相关代码,请勿粘贴截图

但后台怎么写呢?微服务可以直接校验用户名和密码,生成token,返回给前端,下次前端登陆的时候后台通过token可以跳过账号密码的验证,但,还设计到网关的问题,网关那边我如何拦截?还有其他微服务的认证,以及权限问题,权限我是弄一个单独的表呢?还是可以通过token直接认证呢?以及网关拦截问题,如果没有token,如果有token怎么做?有点迷茫,卡住两天了,给个完整的思路吧,有代码最好啦.

我想要达到的结果

前端传递账号密码,通过网关,认证微服务,认证微服务返回一个token,下次登陆的时候直接放行,以及账号的权限如何设置?

  1. token解决的身份认证的问题,通过认证,代表请求是合法的,token不能解决权限问题,因此权限需要单独设计
  2. 权限设计的思路大致如下:
    在后端配置不同的身份拥有不同的权限,比如A身份有权限1,B身份有权限2
    当token校验通过后,就知道当前请求的身份是A还是B,然后通过身份可以判断关联的权限是1还是2
    然后再根据权限判断该权限是否允许该请求,如果权限1允许当前请求,那么A用户请求时正常执行后端逻辑。如果是B用户请求,则返回403权限不足
    以上是类似权限设计的思路。
    请采纳,十分感谢!
    如果还有任何疑问可以继续沟通交流。

其实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来实现,资源中心进行权限验证

建议你去某云上找几个开源项目,平台类型的就行,基本都会带完整的权限管理,说难不难,但也不是几句话能说清的

  1. 认证可以统一在网关做,网关验证token,若失败直接返回,若成功解析用户信息,通过header将用户信息传递到下游微服务,下游微服务可以直接从header中获取用户信息
  2. 统一的权限也可以在网关处理,微服务也可以定制自己的权限管理

统一认证和权限管理可以统一成一个微服务,统一网关验证时调该服务的接口

网关拦截所有请求,获取请求头部信息得到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,就一大堆