shiro的簡(jiǎn)單使用

一、shiro認(rèn)證

1、請(qǐng)求認(rèn)證
Subject subject = SecurityUtils.getSubject();// 根據(jù)運(yùn)行環(huán)境返回subject
subject.login(token);// 這里的token一般指的是 UsernamePasswordToken玷禽,參數(shù)有
                     // String username, String password, boolean rememberMe, String host 膘流,有多種構(gòu)造函數(shù)
2早龟、通過SecurityManager執(zhí)行認(rèn)證
public void login(AuthenticationToken token) throws AuthenticationException {
    this.clearRunAsIdentitiesInternal();
    Subject subject = this.securityManager.login(this, token);// 調(diào)用securityManager
    String host = null;
    PrincipalCollection principals;
    if (subject instanceof DelegatingSubject) {
        DelegatingSubject delegating = (DelegatingSubject)subject;
        principals = delegating.principals;
        host = delegating.host;
    } else {
        principals = subject.getPrincipals();
    }// 無論怎么樣principals = subject.getPrincipals();既用戶名

    if (principals != null && !principals.isEmpty()) {
        this.principals = principals;
        this.authenticated = true;
        if (token instanceof HostAuthenticationToken) {
            host = ((HostAuthenticationToken)token).getHost();
        }

        if (host != null) {
            this.host = host;
        }

        Session session = subject.getSession(false);
        if (session != null) {
            this.session = this.decorate(session);
        } else {
            this.session = null;
        }

    } else {
        String msg = "Principals returned from securityManager.login( token ) returned a null or empty value.  This value must be non null and populated with one or more elements.";
        throw new IllegalStateException(msg);
    }
}
3、SecurityManager通過ModularRealmAuthenticator再通過realm進(jìn)行認(rèn)證

在自定義的Realm中完成認(rèn)證

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    //獲取用戶的輸入的賬號(hào).
    String username = (String) token.getPrincipal();
    User user = userService.selectByUsername(username);
    String password = user.getPassword();
    if (user == null) throw new UnknownAccountException();
    if (0 == user.getEnable()) {
        throw new LockedAccountException(); // 帳號(hào)鎖定
    }

    //通過這個(gè)進(jìn)行認(rèn)證,并返回
    SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username, password, null, getName());

    Session session = SecurityUtils.getSubject().getSession();// 當(dāng)驗(yàn)證都通過后,把用戶信息放在session里
    session.setAttribute("userSession", user);
    session.setAttribute("userSessionId", user.getId());
    return simpleAuthenticationInfo;
}
4、認(rèn)證的配置

這些配置在shiro的配置文件中完成

    @Bean
    public MyShiroRealm myShiroRealm() {
        MyShiroRealm myShiroRealm = new MyShiroRealm();
        myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());// 憑證驗(yàn)證器
        return myShiroRealm;
    }

    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {// 憑證驗(yàn)證器
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();

        hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:這里使用MD5算法;
        hashedCredentialsMatcher.setHashIterations(1);//散列的次數(shù)炎辨,比如散列兩次,相當(dāng)于 md5(md5(""));

        return hashedCredentialsMatcher;
    }

二聪姿、shiro授權(quán)

1碴萧、ModularRealmAuthenticator通過realm進(jìn)行認(rèn)證

在自定義的Realm中完成授權(quán),將用戶的權(quán)限查出末购,配置到info中去勿决。

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

    String username = (String) principalCollection.getPrimaryPrincipal();
    User user = userService.selectByUsername(username);

    Map<String, Object> map = new HashMap();
    map.put("userid", user.getId());

    List<Resources> resourcesList = resourcesService.loadUserResources(map);

    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  // 權(quán)限信息對(duì)象info
    for (Resources resources : resourcesList) {
        info.addStringPermission(resources.getResurl()); // 在這里存放查出的用戶的所有的角色(role)及權(quán)限(permission)
    }
    return info;
}
2、授權(quán)的配置招盲,通過filterChainDefinitionMap在Shiro的攔截器中配置

這些配置在shiro的配置文件中完成

   @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setSuccessUrl("/usersPage");// 登錄成功跳轉(zhuǎn)的頁
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");// 未授權(quán)界面;

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap();
        filterChainDefinitionMap.put("/logout", "logout");// 配置登出地址低缩,不需要專門去寫控制器
        filterChainDefinitionMap.put("/css/**", "anon");
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/img/**", "anon");
        filterChainDefinitionMap.put("/font-awesome/**", "anon");// 首先放過一般的靜態(tài)資源
  
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); // 配置所有需要攔截的地址
        return shiroFilterFactoryBean;
    }
2.1配置規(guī)則
// 將需要配置的地址放入map中,規(guī)則如下:
/**
anon:例子/admins/**=anon 沒有參數(shù),表示可以匿名使用咆繁。

authc:例如/admins/user/**=authc表示需要認(rèn)證(登錄)才能使用讳推,沒有參數(shù)

roles(角色):例子/admins/user/**=roles[admin],參數(shù)可以寫多個(gè),多個(gè)時(shí)必須加上引號(hào)玩般,
并且參數(shù)之間用逗號(hào)分割银觅,當(dāng)有多個(gè)參數(shù)時(shí),例如admins/user/**=roles["admin,guest"]坏为,
每個(gè)參數(shù)通過才算通過究驴,相當(dāng)于hasAllRoles()方法。

perms(權(quán)限):例子/admins/user/**=perms[user:add:*]匀伏,參數(shù)可以寫多個(gè)洒忧,多個(gè)時(shí)必須加上引號(hào)够颠,
并且參數(shù)之間用逗號(hào)分割熙侍,例如/admins/user/**=perms["user:add:*,user:modify:*"],
當(dāng)有多個(gè)參數(shù)時(shí)必須每個(gè)參數(shù)都通過才通過履磨,想當(dāng)于isPermitedAll()方法蛉抓。

rest:例子/admins/user/**=rest[user],根據(jù)請(qǐng)求的方法,相當(dāng)于/admins/user/**=perms[user:method] 剃诅,
其中method為post巷送,get,delete等矛辕。

port:例子/admins/user/**=port[8081],當(dāng)請(qǐng)求的url的端口不是8081是跳轉(zhuǎn)到
schemal://serverName:8081?queryString,其中schmal是協(xié)議http或https等惩系,
serverName是你訪問的host,8081是url配置里port的端口,queryString是你訪問的url里的如筛?后面的參數(shù)。

authcBasic:例如/admins/user/**=authcBasic沒有參數(shù)表示httpBasic認(rèn)證

ssl:例子/admins/user/**=ssl沒有參數(shù)抒抬,表示安全的url請(qǐng)求杨刨,協(xié)議為https

user:例如/admins/user/**=user沒有參數(shù)表示必須存在用戶,當(dāng)?shù)侨氩僮鲿r(shí)不做檢查
*/
// 詳情參考shiro.web.filter源碼

三擦剑、shiro認(rèn)證

在shiro的配置文件中加入

@Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }

html中加入xmlns

<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

maven依賴

<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>1.2.1</version> 
</dependency>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妖胀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠勒,更是在濱河造成了極大的恐慌赚抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠屋,死亡現(xiàn)場(chǎng)離奇詭異涂臣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門赁遗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來署辉,“玉大人,你說我怎么就攤上這事岩四】蕹ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵剖煌,是天一觀的道長(zhǎng)材鹦。 經(jīng)常有香客問我,道長(zhǎng)耕姊,這世上最難降的妖魔是什么桶唐? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮箩做,結(jié)果婚禮上莽红,老公的妹妹穿的比我還像新娘。我一直安慰自己邦邦,他們只是感情好安吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燃辖,像睡著了一般鬼店。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黔龟,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天妇智,我揣著相機(jī)與錄音,去河邊找鬼氏身。 笑死巍棱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛋欣。 我是一名探鬼主播航徙,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼陷虎!你這毒婦竟也來了到踏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尚猿,失蹤者是張志新(化名)和其女友劉穎窝稿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凿掂,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伴榔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潮梯。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骗灶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秉馏,到底是詐尸還是另有隱情耙旦,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布萝究,位于F島的核電站免都,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帆竹。R本人自食惡果不足惜绕娘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栽连。 院中可真熱鬧险领,春花似錦、人聲如沸秒紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熔恢。三九已至脐湾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叙淌,已是汗流浹背秤掌。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰霍,地道東北人闻鉴。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茂洒,于是被迫代替她去往敵國(guó)和親孟岛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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