Convolutional Neural Networks for Sentence Classification阅读梗概

Gitee是什么?和GitHub的区别?

  返回  

springSecurity jwt 如何融合

2021/8/21 17:29:51 浏览:

springSecurity:

用于认证(token有没有,正确与否),通过jwt实现的

与鉴权(调接口有没有权限)的,只是走了jwt过滤器(获取用户权限),实现是自己实现的。

jwt:用于签名与验签的,为了接口安全。与以前的token比较相似。

所以:

认证主要jwt实现

鉴权:springSecurity实现。

-------------------------------------------

实现过程中疑问,待整理


0.jwt 加签->验签 加签中包含:头部()负载(用户名,创建时间)验签:传与算一直,别人篡改什么?用户名? 验签成功标识?失败提示什么?@篡改 用户名。1.token 错误,根据token 解析荷载是会报错,其实这里应该把异常抛出,token错误!实际报异常:暂未登录或token已经过期,因为取了要取用户信息,取不到报错。不取用户不会报错,即便token错误
 验签:就是根据token 反解jwt,无token或token被篡改,回报异常,说明验签失败!
 /**
     * 从token中获取JWT中的负载
     */
    private Claims getClaimsFromToken(String token) {
        Claims claims = null;
        try {
            claims = Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            LOGGER.info("JWT格式验证失败:{}", token, e);
        }
        return claims;
    }
    
1.注册后,用户信息怎么进入security的,
2.权限怎么进去的   SecurityConfig configure 在这里从数据库查询权限,还有用户信息保存了,保存到哪里了?->AdminUserDetails 包含用户信息,权限信息,并提供对外接口
2.1 用户权限信息包含两部分 1.角色权限表 2.用户权限表,用户权限表数据怎么进去的? @登录时,查数据库表,取权限赋值??不是登录时还是直接取UserDetailsService!!!
3.sysUser 用户类 联系
4.jwt 生成token原理
普通token只有过期时间与用户信息,而且会被伪造,jwt包含签名,不会被伪造。更像是一个签名
4.用户登录成功后,除了token,还有菜单权限数据,还有一个权限列表,这是个啥,权限值吗,有什么?鉴权吗
5.登录用户如何缓存,获取当前用户ID
6.根据用户名,获取用户信息密码,权限原理,应该是登录成功后,缓存了?用户名哪里来:根据token获取,jwt中获取,因为登录生产jwt时,存入了用户名。
7.jwt 自定义鉴权过滤器 做什么 1.用户名是否正确 security中获取与token中是否一直,token中是当前登录人,为什么?防止A登录成功,拿B的token取调接口,扩大权限,显然只判断有效期不行,2.token是否过期 
8.UserDetailsService 根据用户名取用户信息,调用场景 登录时 1.登录取密码校验 2.jwt过滤器 验证用户名,token,最终从缓存中获取。但是入口在AdminUserDetails,说明在某时候数据进入了缓存 EhCache,进程内缓存,不支持分布式
9.ums_admin_permission_relation 用户权限表中type=1含义 数据入口在->给用户分配+-权限,含义?应该是增加删除权限,每次都是权限全量,与用户角色权限中权限比较,多:标记为+,少:标记为-,记的意义应该是保存记录
10.SecurityContext 取权限 赋值权限,但是权限值也是从UserDetails中获取,??此处哪里给?何时给?看上面:第二点
11.解决用户登录查库问题
方式1.实现接口:UserDetailsService,重写方法,查询库把用户及权限信息写入,UserDetail接口。
方式2.重写配置类SecurityConfig 中 抽象类WebSecurityConfigurerAdapter userDetailsService方法

12.用户登录流程
虽然jwt配置了过滤登录请求,但是还是会走jwt过滤器(没有token 不会走jwt 认证及鉴权),然后到登录接口,根据用户名无法获得用户信息,说明用户名错误,抛出用户名密码错误。
如果密码错误,取到用户信息后,再比较密码,不正确抛出。那问题来了,为什么能获取用户信息???注册时缓存吗?@@@@查询数据库的!!每次都查询吗?应该是,之前有人说,不要每次查看??
13.权限来源于哪?UsernamePasswordAuthenticationToken 赋值过两次权限,都是从数据库查询用户权限,然后给到token。场景:1.登录 2.jwt过滤器(调用非登录接口时)。应该没有缓存,都是实时取表
登录成功后,把信息赋值UserDetail接口(重写),后面调用其他接口,可以直接获取用户名。
正常的应该只需要登录时查询数据库,取出权限,后面调接口从缓存中获取,这里就涉及一个缓存刷新问题???

14.当未登录或者token失效,(无token或错误,无法根据token反解jwt,报异常,到下一个过滤链,进入自定义异常)访问接口时,自定义的返回结果  RestAuthenticationEntryPoint 调用接口未带token,来这里,{
  "code": 401,
  "data": "Full authentication is required to access this resource",
  "msg": "暂未登录或token已经过期"
}

15.访问接口时,可获取当前用户所有权限,具体怎么校验有没有权限,登录后,会返回菜单和权限,这时候前端会处理,没有就看不到菜单或者按钮。但是通过接口怎么拦截,

自定义:登录失败处理器,两种方式
@Component
//public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
public class RestAuthenticationEntryPoint implements AuthenticationFailureHandler {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        response.getWriter().println(JSON.toJSONString(BaseResult.unauthorized(authException.getMessage())));
        response.getWriter().flush();
    }

    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                    AuthenticationException e) throws IOException, ServletException {
        
    }
}

实际代码中并没有采用以上任意一种,而是在登录时,捕获了用户或密码错误异常,统一返回报错。

16.验证权限
无权限报错: 不允许访问
在接口添加权限限制 @PreAuthorize("hasAuthority('product') 
问题
1.没走自定义无权限,直接报:不允许访问
2.原理是什么,异常从哪抛出的
3.不手动添加权限限制,直接调接口,怎么实现鉴权

17.登出 
jwt 在有效期一直可用,无失效逻辑。
token:之前都是存在redis有失效机制。
需要做两件事
1.前端删除token
2.自定义登录处理器,并在security中配置,把请求头token设置为空。

18 SecurityConfig jwt直接关联
在security配置类中加 入jwt过滤器

实际代码中并没有做什么如何实现?
解决方案:
https://blog.csdn.net/hanxiaotongtong/article/details/103347063

业务
1.接口请求请求头带 token, Authorization:token
2.刷新token,只是在jwt生产token中,更新了创建时间

jwt作用 
0.认证 根据判断用户名,密码
1.身份认证(区别于用户名,密码,验证码认证)
2.鉴权,权限不足

【登录】
1.返回token
2.返回权限 ??这个包含什么,什么时候进入,见上面第二点
3.返回权限菜单,无按钮or接口


jwt:
  tokenHeader: Authorization
  secret: mySecret
  # 60*60*24
  expiration: 604800  s /60/60 168  7天有效期
  tokenHead: Bearer
  
  

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号