doufuplus / blog-comment

博客评论
0 stars 0 forks source link

SpringBoot整合shiro+jwt+redis - 无状态token登录(三)鉴权篇 | 豆腐别馆 #11

Open doufuplus opened 5 years ago

doufuplus commented 5 years ago

https://www.doufuplus.com/blog/shiro-jwt03.html

mamomo1988 commented 5 years ago

感谢楼主写的帖子,受益匪浅,最近正要做前后端分离的项目,我觉得我已经大概有思路了

doufuplus commented 5 years ago

@mamomo1988 感谢楼主写的帖子,受益匪浅,最近正要做前后端分离的项目,我觉得我已经大概有思路了

不客气:blush:

3-8UUID commented 4 years ago

大佬,我有些问题想请教,可否叫个好友qq_770024829

frankcbliu commented 4 years ago

感谢博主,正好用上了。 之前写 springboot + vue 前后端分离,用了 shrio,可惜网上这方面的资料都不是很全,今晚终于解决了。

doufuplus commented 4 years ago

@learningNicolas 感谢博主,正好用上了。 之前写 springboot + vue 前后端分离,用了 shrio,可惜网上这方面的资料都不是很全,今晚终于解决了。

不客气😊

zhankang77 commented 4 years ago

楼主你好 user第一次登陆过jwt过滤器 isAccessAllowed这方法 request本来是没Authorization 怎么办

doufuplus commented 4 years ago

@zhankang77 楼主你好 user第一次登陆过jwt过滤器 isAccessAllowed这方法 request本来是没Authorization 怎么办

是指的不会有token,还是你自己没传。不会有token的就意味着不需要拦截,放行即可。

zhankang77 commented 4 years ago

@doufuplus

@zhankang77 楼主你好 user第一次登陆过jwt过滤器 isAccessAllowed这方法 request本来是没Authorization 怎么办

是指的不会有token,还是你自己没传。不会有token的就意味着不需要拦截,放行即可。

那别的url没登陆之前也没有token 这样不都放行了吗 我登陆的时候 url也经过executeLogin 但是token为空的话 就报错了 需要在shiroFilter 配置login接口过滤吗

doufuplus commented 4 years ago

@zhankang77

@doufuplus

@zhankang77 楼主你好 user第一次登陆过jwt过滤器 isAccessAllowed这方法 request本来是没Authorization 怎么办

是指的不会有token,还是你自己没传。不会有token的就意味着不需要拦截,放行即可。

那别的url没登陆之前也没有token 这样不都放行了吗 我登陆的时候 url也经过executeLogin 但是token为空的话 就报错了 需要在shiroFilter 配置login接口过滤吗

首先,不是说没有token就放行,而是要看你需求而决定拦不拦截。至于比如登录、注册等接口,这本来就不会有也不需要携带token,当然不拦截。 其次,代码抛异常是必要的,不然统一异常拦截如何生效?token为空就报错是因为示例代码中默认的是拦截全部,不需要拦截的接口自己配置白名单即可。 还有建议如有条件登录注册等应与业务服务分开。

zhankang77 commented 4 years ago

@doufuplus

@zhankang77

@doufuplus

@zhankang77 楼主你好 user第一次登陆过jwt过滤器 isAccessAllowed这方法 request本来是没Authorization 怎么办

是指的不会有token,还是你自己没传。不会有token的就意味着不需要拦截,放行即可。

那别的url没登陆之前也没有token 这样不都放行了吗 我登陆的时候 url也经过executeLogin 但是token为空的话 就报错了 需要在shiroFilter 配置login接口过滤吗

首先,不是说没有token就放行,而是要看你需求而决定拦不拦截。至于比如登录、注册等接口,这本来就不会有也不需要携带token,当然不拦截。 其次,代码抛异常是必要的,不然统一异常拦截如何生效?token为空就报错是因为示例代码中默认的是拦截全部,不需要拦截的接口自己配置白名单即可。 还有建议如有条件登录注册等应与业务服务分开。

好的 明白了 感谢!

JASONSENSEN commented 4 years ago

博主您好,想请问一下,如何对不携带token的请求进行拦截,是使用authc吗?

zhuzhiqiang0506 commented 4 years ago

我加到项目中去 无论访问什么都会进 UserRealm 的 doGetAuthenticationInfo ,这可能是哪里配错了呀

Lengfengkong commented 4 years ago

用这种方式,通过JWT传过去鉴权,跟直接使用cookie去鉴权,对Redis的消耗,jwt是cookie的6~7倍

JASONSENSEN commented 4 years ago

@zhuzhiqiang0506 我加到项目中去 无论访问什么都会进 UserRealm 的 doGetAuthenticationInfo ,这可能是哪里配错了呀

JWTFilter类里把所有的请求都拦截了,你需要在shiroConfig里配置一个白名单;注意配置过滤器链时的过滤器执行顺序问题

zhuzhiqiang0506 commented 4 years ago

@JASONSENSEN

@zhuzhiqiang0506 我加到项目中去 无论访问什么都会进 UserRealm 的 doGetAuthenticationInfo ,这可能是哪里配错了呀

JWTFilter类里把所有的请求都拦截了,你需要在shiroConfig里配置一个白名单;注意配置过滤器链时的过滤器执行顺序问题

你好,是在ShiroConfig里的factory方法里的filterRuleMap嘛 ,我第一次搞这个东西 不太懂

zhuzhiqiang0506 commented 4 years ago

@JASONSENSEN

@zhuzhiqiang0506 我加到项目中去 无论访问什么都会进 UserRealm 的 doGetAuthenticationInfo ,这可能是哪里配错了呀

JWTFilter类里把所有的请求都拦截了,你需要在shiroConfig里配置一个白名单;注意配置过滤器链时的过滤器执行顺序问题

已经解决了 感谢

doufuplus commented 4 years ago

@Lengfengkong 用这种方式,通过JWT传过去鉴权,跟直接使用cookie去鉴权,对Redis的消耗,jwt是cookie的6~7倍

去探究对比的出发点是好的,但是要根据项目实际看,不然扣这种没意义。

首先这里是存在着一个前提,就是cookie本身存在的不易管理等的弊端,导致我们不得不放弃cookie,而采用token方式是目前最适合前后分离项目的一种方式。 其次,token生成的方式有很多种,jwt只是目前比较友好的方案之一,操作token续时的方式也有很多种,引入redis也只是其中的方式之一。

也就是说,自己的项目适合什么是要自己去考量。所谓的消耗,具体到底慢了多少?1毫秒还是2毫秒?是否在可接受的范围?此种消耗不同于因代码的不规范如for循环内调用数据库引起的消耗,如果当你的项目都要开始扣这种消耗来优化访问速度的时候,我相信你的团队以及你的项目架构也绝非是区区springboot+shiro可以应对的。

当然如果有更好的解决方案,欢迎探讨。以上。

zhuzhiqiang0506 commented 4 years ago

楼主,我加了这个方法@RequiresPermissions,也在授权方法里授权成功了,但为什么就是一直进handle401这个方法说让我请先登录呢

bolodu commented 4 years ago

好像不用shiro也可以做SSO?那shiro到底起的什么作用?

Ryoui commented 4 years ago

写得明白

17864293318 commented 4 years ago

楼主您好,我想请教一个问题.1.项目是前后端分离,我的问题是:后端是用户登录后就把用户拥有所有的权限是以json格式返给前端吗?然后前端就根据这些权限判断用户对那些按钮有权限?2.还是说用户点击按钮后前端请求后端判断是否有权限?我qq 1131866738 您方便加吗

cdfan commented 4 years ago

楼主你好,我想问一下,如果这样实现我是不是每次访问的时候都会进入自定义的过滤器,进入过滤器之后都需要在执行executeLogin进行登录? 如果每次访问都要登录,哪效率是不是有点太低了啊

doufuplus commented 4 years ago

@bolodu 好像不用shiro也可以做SSO?那shiro到底起的什么作用?

shiro只是一个权限控制框架

doufuplus commented 4 years ago

@f4112cd 楼主你好,我想问一下,如果这样实现我是不是每次访问的时候都会进入自定义的过滤器,进入过滤器之后都需要在执行executeLogin进行登录? 如果每次访问都要登录,哪效率是不是有点太低了啊

这个是可以在Filter里面配置的,文章有提到。demo只是默认配置了全部路径。

doufuplus commented 4 years ago

@Ryoui 写得明白

谢谢😊

Dylan-cms commented 4 years ago

我的项目需要对外开放api接口,公司其他系统调用接口生成流水号,访问量比较大,如果接口加上了jwt验证,每次调用时都要进行认证,在高并发的情况下我担心无法保证效率,但是为了接口的安全性,不能在过滤链配置成anon,好矛盾,接口效率和安全性两者如何兼得(QAQ)??

YueXIanHu commented 4 years ago

属性注入这个问题可以看一下这个 https://www.cnblogs.com/heguxin/p/10941874.html

weixingna commented 4 years ago

文末给出的github地址,打开里面有好多个shiro-jwt分支的啊,不知道该选哪一个

weixingna commented 4 years ago

源码下来咋测试啊,sso login一直没有返回错误,控制台也不报错,难搞哦

weixingna commented 4 years ago

@JeeCoding 属性注入这个问题可以看一下这个 https://www.cnblogs.com/heguxin/p/10941874.html

兄弟,博主给的源码哪一个模块对应这篇博文的呀

yunhaozhu commented 3 years ago

有没有考虑过集合成一个包,shiro+redis+jwt?

gh-nom commented 3 years ago

如果说 没有登录去访问其他的 需要登录的页面,这里并没有对重定向进行说明,而且前后端分离项目如何去进行登录重定向呢?

mamomo1988 commented 3 years ago

@Guanghua0714 如果说 没有登录去访问其他的 需要登录的页面,这里并没有对重定向进行说明,而且前后端分离项目如何去进行登录重定向呢?

根据链接地址来过滤是不是要检测token,在JwtFilter过滤器中检测token,没有则重定向到controller的某个服务,controller正常返回json数据(抛异常也行,写个ExceptionHandler,添加RestControllerAdvice注解,返回正常的json数据给前端),前端根据code判断要不要跳转到登录页面即可。

gh-nom commented 3 years ago

谢谢,这样一说我就明白了。-------- 原始邮件 --------发件人: mamomo1988 @.>日期: 2021年6月5日周六 11:14收件人: doufuplus/blog-comment @.>抄送: Guanghua0714 @.>, Mention @.>主 题: Re: [doufuplus/blog-comment] SpringBoot整合shiro+jwt+redis - 无状态token登录(三)鉴权篇 | 豆腐别馆 (#11)

@Guanghua0714 如果说 没有登录去访问其他的 需要登录的页面,这里并没有对重定向进行说明,而且前后端分离项目如何去进行登录重定向呢?

根据链接地址来过滤是不是要检测token,在JwtFilter过滤器中检测token,没有则重定向到controller的某个服务,controller正常返回json数据(抛异常也行,写个ExceptionHandler,添加RestControllerAdvice注解,返回正常的json数据给前端),前端根据code判断要不要跳转到登录页面即可。

—You are receiving this because you were mentioned.Reply to this email directly, view it on GitHub, or unsubscribe.

gh-nom commented 3 years ago

请问报这样的错误是为什么 无权访问(Unauthorized):Submitted credentials for token did not match the expected credentials.

chiseller commented 2 years ago
   @Bean("jwtFilter")
   public JwtFilter jwtFilterBean() {
       return new JwtFilter();
  }

看了下源码,这个地方的自定义过滤器不应该直接注入,会导致每次请求都经过自定义的过滤器