工作党学Shiro:下班后的2小时,我是怎么啃下这个安全框架的?
说实话,提起Shiro,我一开始是拒绝的,白天上班已经够累了,晚上回家还得对着电脑研究什么认证、授权、会话管理……光是这几个词摆在一起,我脑子就嗡嗡的,但没办法啊,项目里要用,总不能一直绕着走吧?于是咬咬牙,开启了我的“工作党学Shiro”之路,今天就把我这段时间踩过的坑、熬过的夜、以及那些突然开窍的瞬间,一股脑儿倒给你们。

先说说我为什么非得学Shiro不可吧。
我们组正在做一个后台管理系统,权限这块儿之前是用手写的拦截器凑合的,代码那叫一个乱啊,东一个if判断西一个session检查,维护起来简直要命,后来技术Leader拍板说上Shiro,我心想:完了,又得学新东西,但转念一想,早学晚学都得学,不如趁这个机会把它拿下。
工作党学Shiro最大的痛点是什么?时间!
白天写业务代码已经耗尽了精力,晚上回家往书桌前一坐,眼皮就开始打架,我试过周末突击,结果周六看了三小时,周日全忘了……后来我调整了策略:每天只学一个小模块,不求多,但求当天能跑通一个demo,比如周一晚上就搞懂“Shiro的认证流程”,周二晚上只研究“Realm怎么写”,周三再啃“授权过滤器”,你别说,这种碎片化的节奏反而适合咱们上班族——脑子不累,进度也看得见。
第一个让我抓狂的点:认证和授权的区别。 我一开始死活分不清这俩兄弟,认证不就是登录吗?授权不就是登录之后能干啥吗?道理我都懂,但一到代码里,Subject.login()和Subject.isPermitted()一混,我就懵,后来我自己画了张图贴在显示器旁边:认证是“你是谁”,授权是“你能干嘛”,每次写代码卡住了就抬头看一眼,嘿,还真管用,所以工作党学Shiro,别嫌方法土,能让你记住的就是好方法。
第二个坑:Realm到底是个啥玩意儿?
官方文档说Realm是“安全数据源”,我读完更迷糊了,后来我把它理解成“查数据库的中间人”——用户登录时,Shiro拿着用户名密码去找Realm,Realm屁颠屁颠跑去数据库比对,然后把结果告诉Shiro,这么一想就通透了!我自己写了个UserRealm继承AuthorizingRealm,重写doGetAuthenticationInfo和doGetAuthorizationInfo两个方法,第一个查用户存不存在、密码对不对,第二个查这个用户有啥角色和权限,第一次跑通登录流程的时候,我差点从椅子上蹦起来——那种成就感,比白天改完十个bug还爽!
第三个拦路虎:过滤器链配置。 filterChainDefinitionMap这个东西,刚开始看简直像天书。/admin/** = authc, roles[admin]——这都啥跟啥啊?后来我硬着头皮一个个试:anon是匿名访问,authc是必须登录,roles[xxx]是必须有某个角色,我拿我们项目练手,把登录页设成anon,后台首页设成authc,用户管理设成roles[admin],然后故意用普通账号去访问管理页——跳转到登录页的那一瞬间,我居然有点感动,工作党学Shiro,就得拿真实项目练,光看文档真的会睡着。
还有一个隐藏的坑:Session管理。 Shiro自己管Session,跟Servlet容器的那套不太一样,我一开始把两者搞混了,用户明明登录了,刷新页面又让我重新登,查了半天才发现是Session没配好,后来在配置文件里加上sessionManager的配置,把globalSessionTimeout调成合适的时间,问题才解决,所以说啊,工作党学Shiro千万别跳过配置细节,不然调试起来真的想砸键盘。
最后聊聊心态吧。 我知道很多工作党跟我一样,下班后只想躺平刷手机,但说实话,学Shiro这段时间,虽然累,但每天晚上关电脑的时候都有一种“今天又比昨天多懂了一点”的踏实感,我现在的进度是:认证授权跑通了,过滤器链配好了,Session也调顺了,接下来准备啃加密和缓存那块,路还长着呢,但至少我不怕了。
如果你也是工作党,也在学Shiro,我劝你一句:别贪多,每天搞懂一个小点就够了。 今天弄明白Subject怎么用,明天搞懂Realm怎么写,后天试试过滤器——一个月下来回头一看,嘿,这框架也没那么吓人嘛!咱们白天搬砖晚上充电,虽然辛苦,但等到项目上线那天,你能拍着胸脯说“权限这块儿我搞的”,那感觉,值了!
共勉啊各位,咱们工作党学Shiro,慢慢来,比较快。