国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Shiro【授權過濾器、與ehcache整合、驗證碼、記住我】

K_B_Z / 3218人閱讀

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

前言

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

Shiro授權過濾器使用

Shiro緩存

與Ehcache整合

Shiro應用->實現驗證碼功能

記住我功能

一、授權過濾器測試

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

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

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

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

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

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

@Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        
        //從 principals獲取主身份信息
        //將getPrimaryPrincipal方法返回值轉為真實身份類型(在上邊的doGetAuthenticationInfo認證通過填充到SimpleAuthenticationInfo中身份類型),
        ActiveUser activeUser =  (ActiveUser) principals.getPrimaryPrincipal();
        
        //根據身份信息獲取權限信息
        //從數據庫獲取到權限數據
        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){
                //將數據庫中的權限標簽 符放入集合
                permissions.add(sysPermission.getPercode());
            }
        }
        
        
    /*    List permissions = new ArrayList();
        permissions.add("user:create");//用戶的創建
        permissions.add("item:query");//商品查詢權限
        permissions.add("item:add");//商品添加權限
        permissions.add("item:edit");//商品修改權限
*/        //....
        
        //查到權限數據,返回授權信息(要包括 上邊的permissions)
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //將上邊查詢到授權信息填充到simpleAuthorizationInfo對象中
        simpleAuthorizationInfo.addStringPermissions(permissions);

        return simpleAuthorizationInfo;
    }

在bean中我們已經配置了:如果沒有權限,那么跳轉到哪個JSP頁面了

        
        

到目前為止,現在問題又來了:

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

2、每次授權都需要調用realm查詢數據庫,對于系統性能有很大影響,可以通過shiro緩存來解決。

二、使用注解式和標簽式配置授權

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

注解式

標簽式

2.1注解式

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

    
    
    
    
        
    

在Controller中使用注解來進行配置就行了,就不用在我們的application-shiro中全部集中配置了

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

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

        return modelAndView;
    }
2.2jsp標簽 授權

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

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

三、Shiro緩存

針對上邊授權頻繁查詢數據庫,需要使用shiro緩存

3.1緩存流程

shiro中提供了對認證信息和授權信息的緩存。shiro默認是關閉認證信息緩存的,對于授權信息的緩存shiro默認開啟的。主要研究授權信息緩存,因為授權的數據量大。

用戶認證通過。

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

3.2使用ehcache和Shiro整合

導入jar包

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



        
    

    
    
        
        
        
    

ehcache的配置文件shiro-ehcache.xml


    
    
    
    

3.3緩存清空

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

還有一種情況:

當管理員修改了用戶的權限,但是該用戶還沒有退出,在默認情況下,修改的權限無法立即生效。需要手動進行編程實現:在權限修改后調用realm的clearCache方法清除緩存。

清除緩存:

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

和shiro整合后,使用shiro的session管理,shiro提供sessionDao操作 會話數據。

配置sessionManager


    
        
        
        
        
    

注入到安全管理器中



        
        
        
        
        
    
四、驗證碼

在登陸的時候,我們一般都設置有驗證碼,但是我們如果使用Shiro的話,那么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就可以發現,為什么我們要把錯誤信息存放在request域對象shiroLoginFailure,因為我們得在Controller中獲取獲取信息,從而給用戶對應的提示


    @RequestMapping("login")
    public String login(HttpServletRequest request)throws Exception{
        
        //如果登陸失敗從request中獲取認證異常信息,shiroLoginFailure就是shiro異常類的全限定名
        String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
        //根據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認證成功會自動跳轉到上一個請求路徑
        //登陸失敗還到login頁面
        return "login";
    }

    
        驗證碼:
          刷新
    
五、記住我

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

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

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


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

    private List menus;// 菜單
    private List permissions;// 權限


}
5.1配置rememeber管理器

    
        
    
    
    
        
        
        
        
    

注入到安全管理器類上

    
    
        
        
        
            
    


配置頁面的input名稱:

            
                
                自動登陸
            

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

        
        /index.jsp  = user
        /first.action = user
        /welcome.jsp = user
六、總結

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

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

Shiro還支持標簽授權,但一般很少用

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

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

手動清空緩存

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

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76342.html

相關文章

  • apache shiro框架

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

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

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

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

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

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

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

    KevinYan 評論0 收藏0
  • Shiro授權整合Spirng、Shiro濾器

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

    ralap 評論0 收藏0

發表評論

0條評論

K_B_Z

|高級講師

TA的文章

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