spring集成shiro簡單權限實現(xiàn)

一.背景

公司新項目淘寶客返利項目烛卧,由我負責后端開發(fā)接口,經(jīng)過了解残吩,淘寶客項目分為移動端(IOS,安卓)和PC端(后臺管理頁面)倘核,移動端要求登陸后30天內(nèi)免登陸泣侮,所以我選擇了用shiro來實現(xiàn)權限控制。

二.選用技術

基礎框架:springmvc+mybatis
安全框架:shiro
存儲:mysql+redis

三.實現(xiàn)流程

統(tǒng)一登陸.png

四.具體實現(xiàn)

問題一:
shiro是通過以來cookie 來實現(xiàn)的登陸,在app端是沒有cookie這一說的紧唱,所以活尊,決定用shiro來生成token,完成登陸漏益。
解決方案:
在登陸的時候蛹锰,生成一個uuid當作token,把token當作key绰疤,userInfo當作value存入redis中铜犬,并返回給前端token,每次請求必須把token帶入請求頭中轻庆。

    public ResponseEntity login(@RequestBody LoginUserEntity loginUserEntity) {
        if (StringUtils.isEmpty(loginUserEntity.getMobile()) && StringUtils.isEmpty(loginUserEntity.getUnionId())) {
            return new ResponseEntity<>(new Result<>(ErrorCode.ILLEGAL_PARAMETER), HttpStatus.OK);
        }
        try {
            TbkUserNameToken token = new TbkUserNameToken(loginUserEntity);
            SecurityUtils.getSubject().login(token);
        } catch (UnknownAccountException e) {
            return new ResponseEntity(new Result<>(ErrorCode.USER_NO_EXIST), HttpStatus.OK);
        } catch (IncorrectCredentialsException e) {
            return new ResponseEntity(new Result<>(ErrorCode.PASSWORD_ERROR), HttpStatus.OK);
        } catch (AccountException e) {
            return new ResponseEntity(new Result<>(ErrorCode.MOBILE_CODE_ERROR), HttpStatus.OK);
        } catch (UnsupportedTokenException e) {
            return new ResponseEntity(new Result<>(ErrorCode.SYSTEM_ERROR), HttpStatus.OK);
        }
        UserInfo token = (UserInfo) SecurityUtils.getSubject().getPrincipal();
        return new ResponseEntity<>(new Result<>(token), HttpStatus.OK);
    }

問題二:
由于app是用戶入口癣猾,pc端是管理員入口,所以余爆,又一個簡單的權限驗證纷宇,我把這權限分為了3中,登陸后權限蛾方,不登陸權限像捶,登陸后admin權限,自定義了一個user的權限转捕,user['admin']

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口,這個屬性是必須的 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 身份認證失敗作岖,則跳轉到登錄頁面的配置 -->
        <property name="loginUrl" value="/index"/>
        <!-- 權限認證失敗,則跳轉到指定頁面 -->
        <property name="unauthorizedUrl" value="/index"/>
        <!--登陸成功-->
        <property name="successUrl" value="/index"/>
        <property name="filters">
            <util:map>
                <entry key="user" value-ref="tokenUserFilter"></entry>
            </util:map>
        </property>
        <!-- Shiro連接約束配置,即過濾鏈的定義 -->
        <property name="filterChainDefinitions">
            <value>
                /favorite/** = user
                /autm/** = user['admin']
                /admin/** = user['admin']
                /jhs/** = user['admin']
                /wx/** = user['admin']
                /fans/** = user
                /share/item/** = user
                /account/** =user
                /cash/** = user
                /usercenter/** = user
                /** = anon
            </value>
        </property>

當需要用戶登陸時候才能訪問的路徑五芝,我標志為user痘儡,當需要用戶登陸,并且具有admin權限的時候枢步,我對路徑驗證是需要user['admin']權限的沉删,其他的屬于開放權限 anon
問題三:
權限驗證時渐尿,如果出現(xiàn)問題,需要返回給前端明確的錯誤碼矾瑰。

    protected boolean isAccessAllowed(ServletRequest req, ServletResponse response, Object mappedValue) {

        HttpServletRequest request = (HttpServletRequest) req;
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            return false;
        }
        String s = redisClient.get(token);
        if (StringUtils.isEmpty(s)) {
            return false;
        }
        try {
            UserInfo userInfo = JSON.parseObject(s, UserInfo.class);
            if (userInfo == null) {
                return false;
            }
            if (mappedValue == null) {
                return true;
            }
            if (mappedValue != null && JSON.toJSONString(mappedValue).contains("admin")) {
                return userInfo.isAdmin();
            }
        } catch (Exception e) {
            logger.error("error access allowed", e);
        }
        return false;
    }
 返回fasle的時候砖茸,會調(diào)用下面方法:
    @Override
    protected boolean onAccessDenied(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        WebUtils.sendJson(JSON.toJSONString(new Result<>(ErrorCode.INVALID_USER)), response);
        return false;
    }

五.總結

本次項目時間非常緊,全部加起來只有1個月時間殴穴,要求全部功能上線凉夯,后端開發(fā)就我一個人,必須對接安卓采幌,ios以及pc的前端劲够,所以在設計shiro的登陸上,怎么簡單怎么來的休傍,從解決問題出發(fā)征绎,不影響用戶登陸為前提,用redis來控制過期時間磨取,雖然本次登陸設計非常簡單人柿,但是從目前上線情況來看,還是非趁ρ幔靠譜的凫岖。
shiro對spring 的集成網(wǎng)上有很多的文章,我只是提供我自己的統(tǒng)一登陸方案慰毅,所以只是貼出來部分代碼隘截。同時記錄下本次快速開發(fā)迭代的技術選型,希望后期不會有問題汹胃。不然我要跑路了

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婶芭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子着饥,更是在濱河造成了極大的恐慌砂客,老刑警劉巖瘪弓,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘朝,死亡現(xiàn)場離奇詭異择同,居然都是意外死亡,警方通過查閱死者的電腦和手機轨奄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門孟害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挪拟,你說我怎么就攤上這事挨务。” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵谎柄,是天一觀的道長丁侄。 經(jīng)常有香客問我,道長朝巫,這世上最難降的妖魔是什么鸿摇? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮劈猿,結果婚禮上拙吉,老公的妹妹穿的比我還像新娘。我一直安慰自己揪荣,他們只是感情好庐镐,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著变逃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怠堪。 梳的紋絲不亂的頭發(fā)上揽乱,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音粟矿,去河邊找鬼凰棉。 笑死,一個胖子當著我的面吹牛陌粹,可吹牛的內(nèi)容都是我干的撒犀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼掏秩,長吁一口氣:“原來是場噩夢啊……” “哼或舞!你這毒婦竟也來了?” 一聲冷哼從身側響起蒙幻,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤映凳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邮破,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈豌,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年抒和,在試婚紗的時候發(fā)現(xiàn)自己被綠了矫渔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡摧莽,死狀恐怖庙洼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤送膳,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布员魏,位于F島的核電站,受9級特大地震影響叠聋,放射性物質(zhì)發(fā)生泄漏撕阎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一碌补、第九天 我趴在偏房一處隱蔽的房頂上張望虏束。 院中可真熱鬧,春花似錦厦章、人聲如沸镇匀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汗侵。三九已至,卻和暖如春群发,著一層夾襖步出監(jiān)牢的瞬間晰韵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工熟妓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雪猪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓起愈,卻偏偏與公主長得像只恨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抬虽,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容