亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Shiro【授權(quán)過(guò)濾器、與ehcache整合、驗(yàn)證碼、記住我】

K_B_Z / 3297人閱讀

摘要:為了達(dá)到很好的效果,我們使用來(lái)對(duì)的緩存進(jìn)行管理配置會(huì)話管理器,對(duì)會(huì)話時(shí)間進(jìn)行控制手動(dòng)清空緩存由于驗(yàn)證用戶名和密碼之前,一般需要驗(yàn)證驗(yàn)證碼的。

前言

本文主要講解的知識(shí)點(diǎn)有以下:

Shiro授權(quán)過(guò)濾器使用

Shiro緩存

與Ehcache整合

Shiro應(yīng)用->實(shí)現(xiàn)驗(yàn)證碼功能

記住我功能

一、授權(quán)過(guò)濾器測(cè)試

我們的授權(quán)過(guò)濾器使用的是permissionsAuthorizationFilter來(lái)進(jìn)行攔截。我們可以在application-shiro中配置filter規(guī)則

        
        /items/queryItems.action = perms[item:query]
        /items/editItems.action = perms[item:edit] 

測(cè)試流程:
1、在applicationContext-shiro.xml中配置filter規(guī)則

/items/queryItems.action = perms[item:query]

2、用戶在認(rèn)證通過(guò)后,請(qǐng)求/items/queryItems.action
3、被PermissionsAuthorizationFilter攔截,發(fā)現(xiàn)需要“item:query”權(quán)限
4、PermissionsAuthorizationFilter 調(diào)用realm中的doGetAuthorizationInfo獲取數(shù)據(jù)庫(kù)中正確的權(quán)限
5、PermissionsAuthorizationFilter對(duì)item:query 和從realm中獲取權(quán)限進(jìn)行對(duì)比,如果“item:query”在realm返回的權(quán)限列表中,授權(quán)通過(guò)。

realm中獲取認(rèn)證的信息,查詢出該用戶對(duì)應(yīng)的權(quán)限,封裝到simpleAuthorizationInfo中,PermissionsAuthorizationFilter會(huì)根據(jù)對(duì)應(yīng)的權(quán)限來(lái)比對(duì)。

@Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        
        //從 principals獲取主身份信息
        //將getPrimaryPrincipal方法返回值轉(zhuǎn)為真實(shí)身份類型(在上邊的doGetAuthenticationInfo認(rèn)證通過(guò)填充到SimpleAuthenticationInfo中身份類型),
        ActiveUser activeUser =  (ActiveUser) principals.getPrimaryPrincipal();
        
        //根據(jù)身份信息獲取權(quán)限信息
        //從數(shù)據(jù)庫(kù)獲取到權(quán)限數(shù)據(jù)
        List permissionList = null;
        try {
            permissionList = sysService.findPermissionListByUserId(activeUser.getUserid());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //多帶帶定一個(gè)集合對(duì)象 
        List permissions = new ArrayList();
        if(permissionList!=null){
            for(SysPermission sysPermission:permissionList){
                //將數(shù)據(jù)庫(kù)中的權(quán)限標(biāo)簽 符放入集合
                permissions.add(sysPermission.getPercode());
            }
        }
        
        
    /*    List permissions = new ArrayList();
        permissions.add("user:create");//用戶的創(chuàng)建
        permissions.add("item:query");//商品查詢權(quán)限
        permissions.add("item:add");//商品添加權(quán)限
        permissions.add("item:edit");//商品修改權(quán)限
*/        //....
        
        //查到權(quán)限數(shù)據(jù),返回授權(quán)信息(要包括 上邊的permissions)
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //將上邊查詢到授權(quán)信息填充到simpleAuthorizationInfo對(duì)象中
        simpleAuthorizationInfo.addStringPermissions(permissions);

        return simpleAuthorizationInfo;
    }

在bean中我們已經(jīng)配置了:如果沒(méi)有權(quán)限,那么跳轉(zhuǎn)到哪個(gè)JSP頁(yè)面了

        
        

到目前為止,現(xiàn)在問(wèn)題又來(lái)了:

1、在applicationContext-shiro.xml中配置過(guò)慮器鏈接,需要將全部的url和權(quán)限對(duì)應(yīng)起來(lái)進(jìn)行配置,比較發(fā)麻不方便使用。

2、每次授權(quán)都需要調(diào)用realm查詢數(shù)據(jù)庫(kù),對(duì)于系統(tǒng)性能有很大影響,可以通過(guò)shiro緩存來(lái)解決。

二、使用注解式和標(biāo)簽式配置授權(quán)

上面的那種方法,還是需要我們將全部的url和權(quán)限對(duì)應(yīng)起來(lái)進(jìn)行配置,是比較不方便的。我們可以使用授權(quán)的另外兩種方式

注解式

標(biāo)簽式

2.1注解式

如果要使用注解式,那么就必須在Spring中開(kāi)啟controller類aop支持

    
    
    
    
        
    

在Controller中使用注解來(lái)進(jìn)行配置就行了,就不用在我們的application-shiro中全部集中配置了

    //商品信息方法
    @RequestMapping("/queryItems")
    @RequiresPermissions("item:query")//執(zhí)行queryItems需要"item:query"權(quán)限
    public ModelAndView queryItems(HttpServletRequest request) throws Exception {
        
        System.out.println(request.getParameter("id"));
    
        //調(diào)用service查詢商品列表
        List itemsList = itemsService.findItemsList(null);

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);
        // 指定邏輯視圖名
        modelAndView.setViewName("itemsList");

        return modelAndView;
    }
2.2jsp標(biāo)簽 授權(quán)

當(dāng)調(diào)用controller的一個(gè)方法,由于該 方法加了@RequiresPermissions("item:query") ,shiro調(diào)用realm獲取數(shù)據(jù)庫(kù)中的權(quán)限信息,看"item:query"是否在權(quán)限數(shù)據(jù)中存在,如果不存在就拒絕訪問(wèn),如果存在就授權(quán)通過(guò)。

當(dāng)展示一個(gè)jsp頁(yè)面時(shí),頁(yè)面中如果遇到,shiro調(diào)用realm獲取數(shù)據(jù)庫(kù)中的權(quán)限信息,看item:update是否在權(quán)限數(shù)據(jù)中存在,如果不存在就拒絕訪問(wèn),如果存在就授權(quán)通過(guò)。

三、Shiro緩存

針對(duì)上邊授權(quán)頻繁查詢數(shù)據(jù)庫(kù),需要使用shiro緩存

3.1緩存流程

shiro中提供了對(duì)認(rèn)證信息和授權(quán)信息的緩存。shiro默認(rèn)是關(guān)閉認(rèn)證信息緩存的,對(duì)于授權(quán)信息的緩存shiro默認(rèn)開(kāi)啟的。主要研究授權(quán)信息緩存,因?yàn)?strong>授權(quán)的數(shù)據(jù)量大。

用戶認(rèn)證通過(guò)。

該用戶第一次授權(quán):調(diào)用realm查詢數(shù)據(jù)庫(kù)
該用戶第二次授權(quán):不調(diào)用realm查詢數(shù)據(jù)庫(kù),直接從緩存中取出授權(quán)信息(權(quán)限標(biāo)識(shí)符)。

3.2使用ehcache和Shiro整合

導(dǎo)入jar包

配置緩存管理器,注入到安全管理器中



        
    

    
    
        
        
        
    

ehcache的配置文件shiro-ehcache.xml


    
    
    
    

3.3緩存清空

如果用戶正常退出,緩存自動(dòng)清空。
如果用戶非正常退出,緩存自動(dòng)清空。

還有一種情況:

當(dāng)管理員修改了用戶的權(quán)限,但是該用戶還沒(méi)有退出,在默認(rèn)情況下,修改的權(quán)限無(wú)法立即生效。需要手動(dòng)進(jìn)行編程實(shí)現(xiàn):在權(quán)限修改后調(diào)用realm的clearCache方法清除緩存。

清除緩存:

    //清除緩存
    public void clearCached() {
        PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
        super.clearCache(principals);
    }
3.4sessionManager

和shiro整合后,使用shiro的session管理,shiro提供sessionDao操作 會(huì)話數(shù)據(jù)。

配置sessionManager


    
        
        
        
        
    

注入到安全管理器中



        
        
        
        
        
    
四、驗(yàn)證碼

在登陸的時(shí)候,我們一般都設(shè)置有驗(yàn)證碼,但是我們?nèi)绻褂肧hiro的話,那么Shiro默認(rèn)的是使用FormAuthenticationFilter進(jìn)行表單認(rèn)證。

而我們的驗(yàn)證校驗(yàn)的功能應(yīng)該加在FormAuthenticationFilter中,在認(rèn)證之前進(jìn)行驗(yàn)證碼校驗(yàn)。

FormAuthenticationFilter是Shiro默認(rèn)的功能,我們想要在FormAuthenticationFilter之前進(jìn)行驗(yàn)證碼校驗(yàn),就需要繼承FormAuthenticationFilter類,改寫(xiě)它的認(rèn)證方法!

4.1自定義Form認(rèn)證類
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {

    //原FormAuthenticationFilter的認(rèn)證方法
    @Override
    protected boolean onAccessDenied(ServletRequest request,
            ServletResponse response) throws Exception {
        //在這里進(jìn)行驗(yàn)證碼的校驗(yàn)
        
        //從session獲取正確驗(yàn)證碼
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpSession session =httpServletRequest.getSession();
        //取出session的驗(yàn)證碼(正確的驗(yàn)證碼)
        String validateCode = (String) session.getAttribute("validateCode");
        
        //取出頁(yè)面的驗(yàn)證碼
        //輸入的驗(yàn)證和session中的驗(yàn)證進(jìn)行對(duì)比 
        String randomcode = httpServletRequest.getParameter("randomcode");
        if(randomcode!=null && validateCode!=null && !randomcode.equals(validateCode)){
            //如果校驗(yàn)失敗,將驗(yàn)證碼錯(cuò)誤失敗信息,通過(guò)shiroLoginFailure設(shè)置到request中
            httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");
            //拒絕訪問(wèn),不再校驗(yàn)賬號(hào)和密碼 
            return true; 
        }
        return super.onAccessDenied(request, response);
    }

        
}
4.2配置自定義類

我們編寫(xiě)完自定義類以后,是需要在Shiro配置文件中配置我們這個(gè)自定義類的。

由于這是我們自定義的,因此我們并不需要用戶名就使用username,密碼就使用password,這個(gè)也是我們可以自定義的。



    
        
        
        
        
 

在Shiro的bean中注入自定義的過(guò)濾器


        
        
            
                
                
            
        
        

在我們的Controller添加驗(yàn)證碼錯(cuò)誤的異常判斷,從我們的Controller就可以發(fā)現(xiàn),為什么我們要把錯(cuò)誤信息存放在request域?qū)ο髎hiroLoginFailure,因?yàn)槲覀兊迷贑ontroller中獲取獲取信息,從而給用戶對(duì)應(yīng)的提示


    @RequestMapping("login")
    public String login(HttpServletRequest request)throws Exception{
        
        //如果登陸失敗從request中獲取認(rèn)證異常信息,shiroLoginFailure就是shiro異常類的全限定名
        String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
        //根據(jù)shiro返回的異常類路徑判斷,拋出指定異常信息
        if(exceptionClassName!=null){
            if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
                //最終會(huì)拋給異常處理器
                throw new CustomException("賬號(hào)不存在");
            } else if (IncorrectCredentialsException.class.getName().equals(
                    exceptionClassName)) {
                throw new CustomException("用戶名/密碼錯(cuò)誤");
            } else if("randomCodeError".equals(exceptionClassName)){
                throw new CustomException("驗(yàn)證碼錯(cuò)誤 ");
            }else {
                throw new Exception();//最終在異常處理器生成未知錯(cuò)誤
            }
        }
        //此方法不處理登陸成功(認(rèn)證成功),shiro認(rèn)證成功會(huì)自動(dòng)跳轉(zhuǎn)到上一個(gè)請(qǐng)求路徑
        //登陸失敗還到login頁(yè)面
        return "login";
    }

    
        驗(yàn)證碼:
          刷新
    
五、記住我

Shiro還提供了記住用戶名和密碼的功能!

用戶登陸選擇“自動(dòng)登陸”本次登陸成功會(huì)向cookie寫(xiě)身份信息,下次登陸從cookie中取出身份信息實(shí)現(xiàn)自動(dòng)登陸。

想要實(shí)現(xiàn)這個(gè)功能,我們的認(rèn)證信息需要實(shí)現(xiàn)Serializable接口


public class ActiveUser implements java.io.Serializable {
    private String userid;//用戶id(主鍵)
    private String usercode;// 用戶賬號(hào)
    private String username;// 用戶名稱

    private List menus;// 菜單
    private List permissions;// 權(quán)限


}
5.1配置rememeber管理器

    
        
    
    
    
        
        
        
        
    

注入到安全管理器類上

    
    
        
        
        
            
    


配置頁(yè)面的input名稱:

            
                
                自動(dòng)登陸
            

如果設(shè)置了“記住我”,那么訪問(wèn)某些URL的時(shí)候,我們就不需要登陸了。將記住我即可訪問(wèn)的地址配置讓UserFilter攔截。

        
        /index.jsp  = user
        /first.action = user
        /welcome.jsp = user
六、總結(jié)

Shiro的授權(quán)過(guò)程和認(rèn)證過(guò)程是類似的,在配置文件上配置需要授權(quán)的路徑,當(dāng)訪問(wèn)路徑的時(shí)候,Shiro過(guò)濾器去找到reaml,reaml返回?cái)?shù)據(jù)以后進(jìn)行比對(duì)。

Shiro支持注解式授權(quán),直接在Controller方法上使用注解聲明訪問(wèn)該方法需要授權(quán)

Shiro還支持標(biāo)簽授權(quán),但一般很少用

由于每次都要對(duì)reaml查詢數(shù)據(jù)庫(kù),性能會(huì)低。Shiro默認(rèn)是支持授權(quán)緩存的。為了達(dá)到很好的效果,我們使用Ehcache來(lái)對(duì)Shiro的緩存進(jìn)行管理

配置會(huì)話管理器,對(duì)會(huì)話時(shí)間進(jìn)行控制

手動(dòng)清空緩存

由于驗(yàn)證用戶名和密碼之前,一般需要驗(yàn)證驗(yàn)證碼的。所以,我們要改寫(xiě)表單驗(yàn)證的功能,先讓它去看看驗(yàn)證碼是否有錯(cuò),如果驗(yàn)證碼有錯(cuò)的話,那么用戶名和密碼就不用驗(yàn)證了。

將自定義的表單驗(yàn)證類配置起來(lái)。

使用Shiro提供的記住我功能,如果用戶已經(jīng)認(rèn)證了,那就不用再次登陸了??梢灾苯釉L問(wèn)某些頁(yè)面。

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76342.html

相關(guān)文章

  • apache shiro框架

    摘要:框架提供的接口,是的核心,代表安全管理器對(duì)象??梢蚤_(kāi)發(fā)人員編寫(xiě),框架也提供一些。在中作為應(yīng)用程序和安全數(shù)據(jù)之間的橋梁或連接器。例如要求中必須同時(shí)含有和的權(quán)限才能執(zhí)行方法。 apache shiro框架簡(jiǎn)介  Apache Shiro是一個(gè)強(qiáng)大而靈活的開(kāi)源安全框架,它能夠干凈利落地處理身份認(rèn)證,授權(quán),企業(yè)會(huì)話管理和加密?,F(xiàn)在,使用Apache Shiro的人越來(lái)越多,因?yàn)樗喈?dāng)簡(jiǎn)單,相比比Sp...

    Tecode 評(píng)論0 收藏0
  • shiro入門(mén)筆記

    摘要:當(dāng)前可以是身份,不需要經(jīng)過(guò)認(rèn)證或者在原先的中存在記錄。當(dāng)前必須擁有所有指定的角色時(shí),才能訪問(wèn)被該注解標(biāo)注的方法。 關(guān)于 Apache Shiro 概念基本都粘自官網(wǎng) http://shiro.apache.org/詳細(xì)中文博客 http://wiki.jikexueyuan.com/p...與SpringBoot整合 https://segmentfault.com/a/11... ...

    yagami 評(píng)論0 收藏0
  • 是這樣用shiro

    摘要:我這里為了簡(jiǎn)化只寫(xiě)了用戶名密碼參數(shù)。如下代碼可以退出當(dāng)前用戶,這樣我們?cè)僬?qǐng)求登錄的時(shí)候就會(huì)繼續(xù)安全認(rèn)證了。當(dāng)我們登錄成功后,我們用是角色但是沒(méi)有權(quán)限的用戶訪問(wèn)是可以請(qǐng)求成功,但是訪問(wèn)是會(huì)跳轉(zhuǎn)到的配置文件的對(duì)應(yīng)的地址,表示權(quán)限不足不可訪問(wèn)。 小述 我在shiro學(xué)習(xí)上花費(fèi)了一些時(shí)間,shiro的資料網(wǎng)上一大推,之前自己學(xué)習(xí)的知識(shí)點(diǎn)一直記錄在有道云筆記上,有道云有自己的好處 那就是沒(méi)有網(wǎng)絡(luò)...

    nanchen2251 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0
  • Shiro授權(quán)、整合Spirng、Shiro過(guò)濾器

    摘要:表示對(duì)用戶資源進(jìn)行操作,相當(dāng)于,對(duì)所有用戶資源實(shí)例進(jìn)行操作。與整合,實(shí)際上的操作都是通過(guò)過(guò)濾器來(lái)干的。將安全管理器交由工廠來(lái)進(jìn)行管理。在過(guò)濾器鏈中設(shè)置靜態(tài)資源不攔截。 前言 本文主要講解的知識(shí)點(diǎn)有以下: Shiro授權(quán)的方式簡(jiǎn)單介紹 與Spring整合 初始Shiro過(guò)濾器 一、Shiro授權(quán) 上一篇我們已經(jīng)講解了Shiro的認(rèn)證相關(guān)的知識(shí)了,現(xiàn)在我們來(lái)弄Shiro的授權(quán) Shir...

    ralap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

K_B_Z

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<