成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

K_B_Z / 3226人閱讀

摘要:為了達到很好的效果,我們使用來對的緩存進行管理配置會話管理器,對會話時間進行控制手動清空緩存由于驗證用戶名和密碼之前,一般需要驗證驗證碼的。

前言

本文主要講解的知識點有以下:

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

Shiro緩存

與Ehcache整合

Shiro應用->實現(xiàn)驗證碼功能

記住我功能

一、授權(quán)過濾器測試

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

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

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

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

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

realm中獲取認證的信息,查詢出該用戶對應的權(quán)限,封裝到simpleAuthorizationInfo中,PermissionsAuthorizationFilter會根據(jù)對應的權(quán)限來比對。

@Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        
        //從 principals獲取主身份信息
        //將getPrimaryPrincipal方法返回值轉(zhuǎn)為真實身份類型(在上邊的doGetAuthenticationInfo認證通過填充到SimpleAuthenticationInfo中身份類型),
        ActiveUser activeUser =  (ActiveUser) principals.getPrimaryPrincipal();
        
        //根據(jù)身份信息獲取權(quán)限信息
        //從數(shù)據(jù)庫獲取到權(quán)限數(shù)據(jù)
        List permissionList = null;
        try {
            permissionList = sysService.findPermissionListByUserId(activeUser.getUserid());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //多帶帶定一個集合對象 
        List permissions = new ArrayList();
        if(permissionList!=null){
            for(SysPermission sysPermission:permissionList){
                //將數(shù)據(jù)庫中的權(quán)限標簽 符放入集合
                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對象中
        simpleAuthorizationInfo.addStringPermissions(permissions);

        return simpleAuthorizationInfo;
    }

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

        
        

到目前為止,現(xiàn)在問題又來了:

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

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

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

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

注解式

標簽式

2.1注解式

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

    
    
    
    
        
    

在Controller中使用注解來進行配置就行了,就不用在我們的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標簽 授權(quán)

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

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

三、Shiro緩存

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

3.1緩存流程

shiro中提供了對認證信息和授權(quán)信息的緩存。shiro默認是關(guān)閉認證信息緩存的,對于授權(quán)信息的緩存shiro默認開啟的。主要研究授權(quán)信息緩存,因為授權(quán)的數(shù)據(jù)量大。

用戶認證通過。

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

3.2使用ehcache和Shiro整合

導入jar包

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



        
    

    
    
        
        
        
    

ehcache的配置文件shiro-ehcache.xml


    
    
    
    

3.3緩存清空

如果用戶正常退出,緩存自動清空。
如果用戶非正常退出,緩存自動清空。

還有一種情況:

當管理員修改了用戶的權(quán)限,但是該用戶還沒有退出,在默認情況下,修改的權(quán)限無法立即生效。需要手動進行編程實現(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操作 會話數(shù)據(jù)。

配置sessionManager


    
        
        
        
        
    

注入到安全管理器中



        
        
        
        
        
    
四、驗證碼

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

而我們的驗證校驗的功能應該加在FormAuthenticationFilter中,在認證之前進行驗證碼校驗。

FormAuthenticationFilter是Shiro默認的功能,我們想要在FormAuthenticationFilter之前進行驗證碼校驗,就需要繼承FormAuthenticationFilter類,改寫它的認證方法

4.1自定義Form認證類
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {

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

        
}
4.2配置自定義類

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

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



    
        
        
        
        
 

在Shiro的bean中注入自定義的過濾器


        
        
            
                
                
            
        
        

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


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

    
        驗證碼:
          刷新
    
五、記住我

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

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

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


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

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


}
5.1配置rememeber管理器

    
        
    
    
    
        
        
        
        
    

注入到安全管理器類上

    
    
        
        
        
            
    


配置頁面的input名稱:

            
                
                自動登陸
            

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

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

Shiro的授權(quán)過程和認證過程是類似的,在配置文件上配置需要授權(quán)的路徑,當訪問路徑的時候,Shiro過濾器去找到reaml,reaml返回數(shù)據(jù)以后進行比對。

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

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

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

配置會話管理器,對會話時間進行控制

手動清空緩存

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

將自定義的表單驗證類配置起來。

使用Shiro提供的記住我功能,如果用戶已經(jīng)認證了,那就不用再次登陸了。可以直接訪問某些頁面。

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76342.html

相關(guān)文章

  • apache shiro框架

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

    Tecode 評論0 收藏0
  • shiro入門筆記

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

    yagami 評論0 收藏0
  • 是這樣用shiro

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

    nanchen2251 評論0 收藏0
  • Java3y文章目錄導航

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

    KevinYan 評論0 收藏0
  • Shiro授權(quán)、整合Spirng、Shiro濾器

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

    ralap 評論0 收藏0

發(fā)表評論

0條評論

K_B_Z

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<