今天就跟大家聊聊有關如何在原有的框架中集成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(); //拿到角色 Setroles = 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 MapcreateFilterChainDefinitionMap(){ //注: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è)資訊頻道,感謝大家的支持。