springtoken认证-spring token 认证
聊聊 Spring Security 那点“不靠谱”但真管用的事 说起 Spring Security,说实话,它给人的第一感觉实际上就是个“防贼团伙”。等你真正想干点正经业务,发现它连把门都开不起来,这时候再想让它帮你干点别的,就得先把它当成一个资源管理器要么配置库来用了。别管它叫啥 Spring,它就是个用 Java 写的防贼团伙,核心就是验证,别指望它给你写多少代码逻辑,主要是给你开点后门,让你去干点别的。 别急着用加密,先看看密码 大量开发者一上来就想搞加密,结局发现根本用不上。Spring Security 的认证机制里,密码实际上默认就是以明文状态存有的。
你想想,明文的密码在代码里只要复制粘贴,立马就能被你的日志记录器、就连你的数据库明文泄露。
故此,别认定它在代码里多写了点加密逻辑,那纯粹是为了让那些想钓鱼的人没办法直接看到你的密码。 真正的保险层是在用户提交密码的那一刻。当你调用 `credentials` 表单要么 CRLF 格式的时候,Spring Security 内部会做几次检查。
起初它会检查这个字符串是不是纯字母数字和特殊符号,比如 `$@!` 这种乱码直接拿回去当垃圾数据处理,别指望它能通过验证。它会去查数据库里对应的账号密码。
这一步是关键,数据库查完之后,Spring 会把这个结局丢回前端。
这时候前端不是立马显示明文,而是会去查 Spring 的配置,看看是不是设置了加密算法(比如 BCrypt)。
最终,前端拿到加密后的结局,再用同一个算法在本地算一遍,算出来的值和后端回的一致,前端才会显式地弹出一个“用户名密码对”的提示框。 这个过程中间,密码根本没在乱码和明文的中间停留。它要么卡在加密算法里,要么就躺在数据库里等着被验证。
故此,要是你看到代码里直接打印明文,那大约率是搞错了地方,要么你根本就没把配置给 Spring 设置好。 后端验证,前端只负责“演戏” 后端验证是核心,这里面的猫腻比前端看起来更深。Spring Security 本身不直接负责“脸红”这种前端交互,那是 `web.servlet` 要么 `app.spring` 这类中间件干的活。后端验证的逻辑是在 `SecurityConfig` 的 `SecurityFilterChain` 配置里写的。 举个例子,要是你写了 `@PreAuthorize` 注解,你是在告诉 Spring:“我要哪位才能访问这个资源?”这不只是是写个注解,背后还牵涉到权限模型、角色映射、还有数据库里的超级管理员判断。
要是你只是单纯想用 `@PreAuthorize`,你会发现这玩意儿在 Spring Security 里简直就是个摆设。出于 `@PreAuthorize` 的工具类 `SecurityUtils` 本质上是一个反射工具,它主要用来检查注解上的权限,而不是去真正的数据库里查表。 要是你真想在后端写个复杂的验证逻辑,比如根据用户 ID 去查表,那务必自己写个 Controller 要么 Service 来干。出于 `SecurityUtils` 没把这事儿干完,你得自己把手里的权限逻辑整理好,再塞进 `SecurityConfig` 的配置接口里。
不然,哪怕你写了最复杂的注解,Spring 也只会告诉你“权限分配成功”,但后端真正的业务逻辑可能至今没有被触发过。 前端那层“隐形之手” 前端实际上只是个参与者,它主要干的是 `@PreAuthorize` 这种注解的调用,还有 CRLF 的提交。
要是你没写啥注解,Spring 不会去管你,前端直接发请求那会儿,后端就是“哪位也不认”。 举个例子,假设你想让 `admin` 角色的人只能访问 `/admin` 接口,但一般/平平用户却能访问。
这时候 `@PreAuthorize` 就在起功能了。它会在请求到达后端之前,把 `HttpServletRequest` 里的 `UserDetails` 对象传出来。
然后 `SecurityUtils` 会去查数据库(要么 Redis),确认用户是不是 `admin`。
要是是,它才准请求持续往下走;要是不是,就直接回 `403 Forbidden`。 这里有个细节,前端发过来的请求里,`UserDetails` 对象可能还没彻底加载好,要么还没绑定到 Spring 的上下文里。
这时候 `SecurityUtils` 去查数据库可能会查不到用户信息,害得它认定用户不是管理员,进而回绝请求。
这时候前端别看没报错,但后端直接扔了个 403 上去,用户自然就收到了。 这种机制有点反直觉,前端没直接写 SQL,后端也没直接写校验规则,但它是通过 `HttpServletRequest` 里的对象,去查数据库的。
要是你没配置好 `SecurityConfig`,要么配置错了,前端可能连请求都发不出去,要么发出去了后端直接“看穿”了用户身份,直接放行。 结论:别把它当数据库用,当个配置库 总结来说,Spring Security 在这个领域最靠谱的地方,就是它的配置和接口。别看它不像数据库那样直接存密码,也不会自动帮你写复杂的缓存逻辑,但它供给了一个贼标准、统一的接口,让你能比较省事地管理权限。 别指望它能给你写个自动鉴权的功能,那得你自己去写。
要是你只是单纯想用 `@PreAuthorize` 做个权限检查,要么想做个登录注册接口,那它确实帮了大忙,配置好了就能用。但要是你想做复杂的业务逻辑,比如根据用户 ID 去查表,别指望它自动帮你,自己写个 Controller 吧。 最终,记住一点,Spring Security 本质就是个防贼团伙。它本身不关心你是哪位,只关心你手里的工具能不能开门。
要是你图撇脱,想让它自动帮你记住密码,要么自动帮你判断权限,结局发现它干不了,那说明你根本没把配置给它,要么配置错了。
这时候,它就是个资源管理器,你得自己去搞,自己去查,自己去写逻辑。别再指望它给你写多少代码逻辑,主要是给你开点后门,让你去干点别的。别把它当成数据库用,也别指望它能自动鉴权,那些都得你自己动手。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
