真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在原有的框架中集成shiro

今天就跟大家聊聊有關如何在原有的框架中集成shiro,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

寧海網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,寧海網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為寧海上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿網(wǎng)站建設公司要多少錢,請找那個售后服務好的寧海做網(wǎng)站的公司定做!

今天的任務是在原有的框架中集成shiro


  1.shiro的認識
> 權限框架(提供的易用的API,功能強大)

   1.1 和Spring security區(qū)別
 
框架       | shiro | Spring security
          ---|------| ---
  易用性  |   √    | X
  粒度      | 粗     | 細(強大)

   1.2 shiro的四大基石
> 身份驗證、授權、密碼學和會話管理
> securityManager:核心對象  realm:獲取數(shù)據(jù)接口


  2.shiro的核心api
   2.1 操作之前,先得到securityManager對象
```

 //一.創(chuàng)建我們自己的Realm
MyRealm myRealm = new MyRealm();

//二.搞一個核心對象:
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(myRealm);

//三.把securityManager放到上下文中
SecurityUtils.setSecurityManager(securityManager);


```

## 2.2 我們使用過的方法

```

//1.拿到當前用戶
Subject currentUser = SecurityUtils.getSubject();
//2.判斷是否登錄
currentUser.isAuthenticated();
//3.登錄(需要令牌的)
/**
    UnknownAccountException:用戶名不存在
    IncorrectCredentialsException:密碼錯誤
    AuthenticationException:其它錯誤
*/
 UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456");
 currentUser.login(token);
 
//4.判斷是否是這個角色/權限
currentUser.hasRole("角色名")
currentUser.isPermitted("權限名")


```
# 3.密碼加密功能
```

/**
 * String algorithmName, Object source, Object salt, int hashIterations)
 * 第一個參數(shù)algorithmName:加密算法名稱
 * 第二個參數(shù)source:加密原密碼
 * 第三個參數(shù)salt:鹽值
 * 第四個參數(shù)hashIterations:加密次數(shù)
 */
SimpleHash hash = new SimpleHash("MD5","123456","itsource",10);
System.out.println(hash.toHex());
```

# 4.自定義Realm
> 繼承AuthorizingRealm
>> 實現(xiàn)兩個方法:doGetAuthorizationInfo(授權)  /doGetAuthenticationInfo(登錄認證)

```
//身份認證
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //1.拿用戶名與密碼
    UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
    String username = token.getUsername();
    //2.根據(jù)用戶名拿對應的密碼
    String password = getByName(username);
    if(password==null){
        return null; //返回空代表用戶名有問題
    }
    //返回認證信息
    //準備鹽值
    ByteSource salt = ByteSource.Util.bytes("asdf");
    //密碼是shiro自己進行判斷
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,getName());
    return authenticationInfo;
}



//授權
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    //拿到用戶名  Principal:主體(用戶對象/用戶名)
    String username = (String)principalCollection.getPrimaryPrincipal();
    //拿到角色
    Set roles = findRolesBy(username);
    //拿到權限
    Set permis = findPermsBy(username);
    //把角色權限交給用戶
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    authorizationInfo.setRoles(roles);
    authorizationInfo.setStringPermissions(permis);
    return authorizationInfo;
}


> 注意:如果我們的密碼加密,應該怎么判斷(匹配器)

//一.創(chuàng)建我們自己的Realm
MyRealm myRealm = new MyRealm();
//創(chuàng)建一個憑證匹配器(無法設置鹽值)
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//  使用MD5的方式比較密碼
matcher.setHashAlgorithmName("md5");
// 設置編碼的迭代次數(shù)
matcher.setHashIterations(10);
//設置憑證匹配器(加密方式匹配)
myRealm.setCredentialsMatcher(matcher);


```


# 5.集成Spring
> 去找:shiro-root-1.4.0-RC2\samples\spring

## 5.1 導包
```


 
    org.apache.shiro
    shiro-all
    1.4.0
    pom

  
  
    org.apache.shiro
    shiro-spring
    1.4.0
  

## 5.2 web.xml> 這個過濾器是一個代碼(只關注它的名稱)
 

 
    shiroFilter
    org.springframework.web.filter.DelegatingFilterProxy
    
      targetFilterLifecycle
      true
    
  

  
    shiroFilter
    /*
  

## 5.3 application-shiro.xml

> 在咱們的application引入

``

> 是從案例中拷備過來,進行了相應的修改```





    
    
        
        
    

    
    
        
        
            
                
                
                
                
            
        
    

    
    
    
    
        
    


    
    
        
        
        
        
        
        
        
        
        
        
    
    
    
    
    

```

5.4 獲取Map過濾

> 注意,返回的Map必需是有序的(LinkedHashMap)```

public class FilterChainDefinitionMapFactory {

    /**
     * 后面這個值會從數(shù)據(jù)庫中來拿
     * /s/login.jsp = anon
     * /login = anon
     * /s/permission.jsp = perms[user:index]
     * /depts/index = perms[depts:index]
     * /** = authc
     */
    public Map createFilterChainDefinitionMap(){
        //注:LinkedHashMap是有序的
        Map filterChainDefinitionMap = new LinkedHashMap<>();

        filterChainDefinitionMap.put("/s/login.jsp", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/s/permission.jsp", "perms[user:index]");
        filterChainDefinitionMap.put("/depts/index", "perms[depts:index]");
        filterChainDefinitionMap.put("/**", "authc");

        return filterChainDefinitionMap;
    }
}

今日重點 : 對securityManage 對象的獲取,在權限認證步驟中需要的信息傳遞(用戶,角色,權限)

細節(jié) : 對于在設置權限列表時需要注意順序,-----放行在前->權限在后->最后同一攔截  /** = authc

看完上述內容,你們對如何在原有的框架中集成shiro有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


名稱欄目:如何在原有的框架中集成shiro
網(wǎng)站路徑:http://weahome.cn/article/pegoci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部