一.Shiro簡介

一.是什么镜粤?

Apache Shiro是Java的一個(gè)安全框架捏题。Shiro可以幫助我們完成:認(rèn)證、授權(quán)肉渴、加密公荧、會話管理、與Web集成同规、緩存等循狰。
從外部看:應(yīng)用代碼直接交互的對象是Subject,也就是說Shiro的對外API核心就是Subject券勺,Shiro不提供維護(hù)用戶/權(quán)限绪钥,而是通過Realm讓開發(fā)人員自己注入。


從內(nèi)部看:通過Securty Manage管理外部請求的認(rèn)證認(rèn)證关炼、授權(quán)程腹、加密、會話管理盗扒、緩存等跪楞。對應(yīng)組件是authenticator,Authorizer侣灶,session manager(自定義的sessionDao)甸祭,cache manage


二.框架流程介紹

  • 容器的創(chuàng)建:通過EnvironmentLoaderListener監(jiān)聽,在容器啟動時(shí)創(chuàng)建 WebEnvironment 對象褥影,并由該對象來讀取 Shiro 配置文件池户,創(chuàng)建WebSecurityManager 與FilterChainResolver 對象。
  • 執(zhí)行攔截器:因?yàn)镾hiro代理了Filter凡怎,先執(zhí)行Shiro的攔截器校焦。ShiroFilter實(shí)現(xiàn)Filter接口的init(),它是整個(gè)程序的入口统倒。(詳細(xì)內(nèi)容見源碼分析)寨典。執(zhí)行完Shiro攔截器后執(zhí)行其他攔截器,之后放行到WebSecurityManager進(jìn)行會話的管理房匆。
  • SecurityManager的各組件通過與subject交互進(jìn)行認(rèn)證耸成,授權(quán)等管理

三.subject介紹**

  • 定義:當(dāng)前正與軟件進(jìn)行交互的任何東西,你可以把 Subject 看成是 Shiro 的"User"概念报亩。
  • 獲取:Subject user=SecurityUtils.getSubject()(當(dāng)前正在執(zhí)行的 Subject), 它獲取的 Subject 是基于關(guān)聯(lián)了當(dāng)前線程或傳入請求的用戶數(shù)據(jù)的井氢。
  • 3.用途:
    • 獲取sesion :user .getSession(); (它不需要一個(gè) HTTP 環(huán)境,任何客戶端技術(shù)現(xiàn)在能夠共享會話數(shù)據(jù))
    • .對角色和權(quán)限的檢查:
    • 是否登錄:user.isAuthenticated()
    • 是否有特定角色與操作權(quán)限:
      user.hasRole("teacher")
      user.isPermitted("teacher:save")
      user.isPermitted("teacher:save:權(quán)限碼")
    • 登錄:
    • 退出:user.logou()

四.SecurityManager組件介紹

1.Authorizer:

  • 定義:操作授權(quán)認(rèn)證組件弦追,通過配置 Realm 實(shí)現(xiàn)或jsp標(biāo)簽,常用于角色授權(quán)

public class NormalRealm extends AuthorizingRealm{

    @Resource
    private AuthorityPermissionService permissionService;
    @Resource
    private AuthorityUsersService authorityUsersService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();//創(chuàng)建Shiro權(quán)限數(shù)據(jù)對象
        Integer userId = Integer.valueOf(principalCollection.toString());//獲取當(dāng)前用戶ID
        AuthorityUsers users = this.authorityUsersService.findById(userId);
        if (users != null) {
            if (users.getAdministrator() == 1) {
                //如果是超級管理員,賦予所有權(quán)限
                authorizationInfo.addStringPermission("*");
            } 
        }
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
   
        return null;
    }
}

2. Authenticator(認(rèn)證器)

  • 定義:對用戶的身份驗(yàn)證(登錄)嘗試負(fù)責(zé)的組件
public class NormalRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    //認(rèn)證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        Object principal = usernamePasswordToken.getPrincipal();
        Object credentials = usernamePasswordToken.getCredentials();
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, getName());
        return info;
    }
}

3. SessionManager(會話管理器)

  • 定義:SessionManager是用來管理Session的組件花竞,包括:創(chuàng)建劲件,刪除,inactivity(失效)及驗(yàn)證
  • Shiro提供了三個(gè)默認(rèn)實(shí)現(xiàn)约急,我們常用DefaultWebSessionManager自定義管理

    * DefaultSessionManager:DefaultSecurityManager使用的默認(rèn)實(shí)現(xiàn)零远,用于JavaSE環(huán)境;
    * ServletContainerSessionManager:用于Web環(huán)境烤宙,其直接使用Servlet容器的會話遍烦;
    * DefaultWebSessionManager:用于Web環(huán)境的實(shí)現(xiàn)俭嘁,可以替代2躺枕,自己維護(hù)著會話,直接廢棄了Servlet容器的會話管理供填。


  • 結(jié)構(gòu)圖


    image.png
  • 常用實(shí)現(xiàn)功能
    • 監(jiān)聽session狀態(tài)拐云,實(shí)現(xiàn)過程在類4中
public class sessionLister implements SessionListener {
    @Override
    public void onStart(Session session) {   
    }
    @Override
    public void onStop(Session session) {
    }
    @Override
    public void onExpiration(Session session) {
    }
}
  @Bean
    public SessionManager sessionManager(RedisSessionDAO sessionDAO) {
        sessionManager.setSessionListeners( new sessionLister() );
        return sessionManager;
    }
    • Session持久化,自定義sessionDAO組件
      sessionDAO:屬性sessionDAO,自定義SessionDAO實(shí)現(xiàn)AbstractSessionDAO,包含增刪改查方便近她,可以將session持久化到redis叉瘩,數(shù)據(jù)庫中。但如果你不打算實(shí)現(xiàn)你自己的SessionDAO粘捎,那么強(qiáng)烈地建議你為Shiro 的SessionManagerment 啟用EHCache Manager 支持薇缅,將會在內(nèi)存中保存會話。
@Component
public class RedisSessionDAO extends AbstractSessionDAO {
    @Resource(name = "redisTemplate")
    private ValueOperations<Serializable, Session> valueOperations;

    @Override
    public void update(Session session) throws UnknownSessionException {
        this.saveSession(session);
    }

    @Override
    public void delete(Session session) {
        if (session == null || session.getId() == null) {
            logger.error("session or session id is null");
            return;
        }
        valueOperations.getOperations().delete(session.getId());

    }

    //用來統(tǒng)計(jì)當(dāng)前活動的session
    @Override
    public Collection<Session> getActiveSessions() {
        return sessions;
    }

    @Override
    protected Serializable doCreate(Session session) {
        return sessionId;
    }

    @Override
    protected Session doReadSession(Serializable sessionId) {
        return s;
    }
}
  @Bean
    public SessionManager sessionManager(RedisSessionDAO sessionDAO) {
        sessionManager.setSessionDAO(sessionDAO);
        return sessionManager;
    }
    • 創(chuàng)建會話Cookie的模板(參照SimpleCookie)
  @Bean
    public SessionManager sessionManager(SimpleCookie simpleCookie) {
        sessionManager.sessionIdCookie(sessionDAO);
        return sessionManager;
    }

4.緩存管理器

  • CacheManager 實(shí)例會自動地直接傳送到SessionDAO攒磨。然后當(dāng)SessionManager 要求EnterpriseCacheSessionDAO 去持久化一個(gè)Session 時(shí)泳桦,默認(rèn)它使用一個(gè)EHCache 支持的Cache實(shí)現(xiàn)去存儲Session 數(shù)據(jù),若配置其他緩存實(shí)現(xiàn)娩缰,不需配置灸撰,主要是緩存到本地。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拼坎,一起剝皮案震驚了整個(gè)濱河市浮毯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泰鸡,老刑警劉巖债蓝,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盛龄,居然都是意外死亡饰迹,警方通過查閱死者的電腦和手機(jī)器虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹦锋,“玉大人兆沙,你說我怎么就攤上這事±虻啵” “怎么了葛圃?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憎妙。 經(jīng)常有香客問我库正,道長,這世上最難降的妖魔是什么厘唾? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任褥符,我火速辦了婚禮,結(jié)果婚禮上抚垃,老公的妹妹穿的比我還像新娘喷楣。我一直安慰自己,他們只是感情好鹤树,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布铣焊。 她就那樣靜靜地躺著,像睡著了一般罕伯。 火紅的嫁衣襯著肌膚如雪曲伊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天追他,我揣著相機(jī)與錄音坟募,去河邊找鬼。 笑死邑狸,一個(gè)胖子當(dāng)著我的面吹牛懈糯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播推溃,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼昂利,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铁坎?” 一聲冷哼從身側(cè)響起蜂奸,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硬萍,沒想到半個(gè)月后扩所,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朴乖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年祖屏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了助赞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袁勺,死狀恐怖雹食,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情期丰,我是刑警寧澤群叶,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站钝荡,受9級特大地震影響街立,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埠通,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一赎离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧端辱,春花似錦梁剔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狸捕。三九已至喷鸽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灸拍,已是汗流浹背做祝。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸡岗,地道東北人混槐。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像轩性,于是被迫代替她去往敵國和親声登。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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

  • 前言: 近期在進(jìn)行shiro權(quán)限管理進(jìn)行學(xué)習(xí)揣苏,網(wǎng)上找了些資料悯嗓,看了開濤哥的系列學(xué)習(xí),但是感覺過于“高冷”卸察,所以記錄...
    WDM96閱讀 592評論 0 1
  • 1.簡介 Apache Shiro是Java的一個(gè)安全框架脯厨。功能強(qiáng)大,使用簡單的Java安全框架坑质,它為開發(fā)人員提供...
    H_Man閱讀 3,158評論 4 48
  • 構(gòu)建一個(gè)互聯(lián)網(wǎng)應(yīng)用合武,權(quán)限校驗(yàn)管理是很重要的安全措施临梗,這其中主要包含: 認(rèn)證 - 用戶身份識別,即登錄 授權(quán) - 訪...
    zhuke閱讀 3,495評論 0 30
  • Apache Shiro Apache Shiro 是一個(gè)強(qiáng)大而靈活的開源安全框架稼跳,它干凈利落地處理身份認(rèn)證盟庞,授權(quán)...
    羅志贇閱讀 3,221評論 1 49
  • 作者:婁山觀 更新時(shí)間:2016-12-01 01:01
    TonY_WZT閱讀 153評論 0 0