berg369
berg369
采纳率63.2%
2020-07-01 14:18 阅读 292
已采纳

当前用户大家怎么设计?是在Service层方法中作为参数传入,还是作为公共方法任何地方获取?

10

当前用户是系统中很特别的一个对象,其实就是会话跟踪,可以用session或者请求中带token,通常统一处理比如在过滤器中,得到当前用户对象放在request的属性中(或者线程变量中),然后

方式1:设计一个静态方法得到当前用户,controller和Service层代码均可访问; 方式2:Controller可以访问得到,service层代码则作为方法参数传入。
请问你们是怎么实现的?

方式2作为Service方法参数缺点是所用用到的方法都要加一个当前用户参数,优点是较为独立通用特别是RPC调用时,rpc调用时并不走过滤器等统一处理,rpc调用是直接访问Service层,所以避免与会话牵扯更好吧。

这里我比较纠结,获取当前用户在很多方法中都会用到,作为参数传递是否太繁琐?请指导,谢谢!

琢磨半天,决定用service方法参数,有数据权限控制的方法就要传入当前用户id,这样会话层只在Controller而不侵入service层,接口远程调用时比较简单,远程我们用dubbo或hessian,方法参数中有了,就不必用外部方法传递用户了(比如通过dubbo的filter或hessian的header传递附件的值)。
但是随后,我想到了一个安全问题。“当前用户”应由系统产生和维护的,不应像普通用户是随便调用的,在方法参数中就会面临调用者传入错误的用户id的问题?无论是查到了别人的数据还是把操作者置为了其他用户都是严重问题。算了吧,还是不要用参数方式了,就算是远程调用,也要通过filter或header传递token。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2020-07-01 15:26

    从面向对象的角度看,最好是抽象出一个接口,用spring等AOP注入,不要自己传参数,更不要作为公共方法任何地方获取
    道理很简单,一旦你那样做,意味着“当前用户”这个功能基本上和所有的类斗耦合上了,再也不能修改了。
    特别是你希望将来为了性能用多机方案,不用session,或者要匹配第三方登录等功能性扩展的时候,代码美发动,会很痛苦。

    点赞 1 评论 复制链接分享
  • qq_36911145 封印di恶魔 2020-07-01 15:44

    我是直接用shiro框架
    然后getSubject获取,在项目任何地方都能调用
    不喜欢shiro用spring的security框架也能实现

    点赞 评论 复制链接分享
  • qq_26478115 会飞的蚂蚁shj 2020-07-01 22:48

    可以用log4j2,在前台项目中添加一个过滤器,在过滤器中添加 [transID],tranID可以使用sessionID+UUID组和,多个微服务之间,通过日志,都可以用过tranid,来定位这个用户的调用链;目前我们公司是这么做的

    点赞 评论 复制链接分享
  • SubeSube SubeSube 2020-07-02 11:38

    我觉得最简单的方法就是传参带上用户id就完美解决问题了..虽然说low了一点,但是这样也快一些...

    点赞 评论 复制链接分享

相关推荐