spring security 登录拦截(过滤) 那种更符合规范?

2020-04-30 09:34:53 +08:00
 linuxsteam

小弟最近刚刚研究 security 整合 jwt 想作为前后端分离的项目的后台

看到网上的文章大概有两种 实现方式

  1. 建立两个过滤器, 一个用来拦截 /login,在 filter 里面写认证 然后进行返回 token 操作,另一个过滤器用来鉴权,拦截其他 URL 。
  2. 只建立一个鉴权过滤器,处理 /login 以外的请求. /login 写在 Controller 里,正常业务操作。跟这个老哥的实现思路一样 https://www.v2ex.com/t/544387

小弟有几个疑问:

  1. JWT 这种属于 security 提供的 httpBasic 还是 formLogin 方式? (网上文章看到使用 formLogin 比较多一些,可能是因为它有自定义登录 URL 的方法。)
  2. 文中两种方案哪种更符合设计思想一些?
5195 次点击
所在节点    Java
23 条回复
chenuu
2020-04-30 10:04:33 +08:00
我是用的第一种
linuxsteam
2020-04-30 10:33:31 +08:00
@chenuu 也许咱们看的教程一样 哈哈。那你自定义 userDetailsService 了吗
Oktfolio
2020-04-30 10:47:33 +08:00
/login 不用管,实现自己的 AuthenticationSuccessHandler 。然后 Jwt 鉴权过滤器。当然我自己还实现了一个 json 登录的过滤器。
chenuu
2020-04-30 11:26:59 +08:00
@linuxsteam 定义了.metadatasource,voter 都有自定义.我这规则略复杂些
linuxsteam
2020-04-30 11:48:26 +08:00
@Oktfolio 你实现了这个, 那你用的是 formLogin 方式吧?
nvkou
2020-04-30 11:50:42 +08:00
千万别自定义。跟着行规走。不然后面上 sso 不好维护
hantsy
2020-04-30 12:00:11 +08:00
Authentication 和 Authorization 两个不同的东西。
1,Authentication 解决用户是否合法,可以使用 user/password, fingerprint, qrcode, onetimepassword 等方式。
2, 拿到授权凭证后,比如 token(access_token, id_token), Authorization 是为了判断是否有相应的操作权限。
EastLord
2020-04-30 12:01:46 +08:00
2
JRay
2020-04-30 12:14:40 +08:00
我也打算搞这套,准备用第二套方案
JRay
2020-04-30 12:18:56 +08:00
突然想到要是用 JWT 的话,强制下线这种操作怎么搞呢?这个是无状态的样,要是另外一个地方也保存了 JWT 强制下线就不好搞了
bsg1992
2020-04-30 13:57:48 +08:00
@JRay jwt 不能用作于中心化的授权场景。 有中心化的场景还是得采用 session 方式
Guozi1989
2020-04-30 16:31:51 +08:00
@JRay 配合 redis 来做
tang123456
2020-04-30 16:45:07 +08:00
目前我们公司用的是第一种,这两天搭项目我也用的第一种
linuxsteam
2020-04-30 17:08:09 +08:00
@JRay 放到 redis 里,我现在写完了,发现跟 spring security 的初衷越来越远了
linuxsteam
2020-04-30 17:09:19 +08:00
@tang123456 这种方式去写的话,感觉就用了 security 的令牌以及权限处理,认证几乎是自己写的吧(实现的自己的过滤器)
securityCoding
2020-04-30 18:40:00 +08:00
1.认证和鉴权是两件事情,第一种是对的
2. @JRay 业务复杂度上来了都会走上 session 这条路
3. 如果在用 spring-cloud 的话 ,我个人推荐还是通过 spring-cloud-gateway 网关自己写 filter 来实现, 把认证和鉴权这种业务无关的行为收拢到网关层面,将复杂度控制在网关层面 ,底层服务聚焦业务即可,只管读相关登录态属性(比如 uid...)
securityCoding
2020-04-30 18:41:30 +08:00
@linuxsteam 哈哈 , 写完发现都是自己的代码,还引入 security 这个复杂的组件...
luckyrayyy
2020-04-30 18:45:14 +08:00
我是第二种 login 放在 controller 里面。
jwt 用的继承 httpbasic
linuxsteam
2020-04-30 20:04:08 +08:00
@securityCoding 自己代码还算一般吧,就是比较费劲,如你所说:第一种使用 Security 比较多。
我用的不是 cloud,是自己爱好写的。写完了,感觉有点泄劲哈哈
Newyorkcity
2020-04-30 21:06:18 +08:00
问下楼主学习 spring security 看什么文档?我看官方文档那么长,读了一两个小时了,我愣是没找到从数据库获取账户密码来进行验证的功能..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX