shiro+springmvc+mybatis【轉】

  1. <span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">  

  2. </span>  


  1. 一直以來,從開發到現在,都還沒自己研究過權限控制。問了老大,老大讓我學習shiro。

  1. <span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">先講一下shiro配置吧。</span>  


需要jar包:

shiro-all-1.2.4.jar

ehcache-2.7.2.jar

slf4j-log4j12-1.6.1-javadoc.jar

slf4j.api-1.6.1.jar

log4j-1.2.15.jar

都是相互依賴的包。

配置文件:spring-shiro.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <beans xmlns="http://www.springframework.org/schema/beans"  

  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  4.     xmlns:context="http://www.springframework.org/schema/context"  

  5.     xmlns:aop="http://www.springframework.org/schema/aop"  

  6.     xmlns:tx="http://www.springframework.org/schema/tx"  

  7.     xmlns:mvc="http://www.springframework.org/schema/mvc"  

  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans  

  9.         http://www.springframework.org/schema/beans/spring-beans.xsd  

  10.         http://www.springframework.org/schema/context  

  11.         http://www.springframework.org/schema/context/spring-context.xsd  

  12.         http://www.springframework.org/schema/aop   

  13.         http://www.springframework.org/schema/aop/spring-aop.xsd  

  14.         http://www.springframework.org/schema/tx   

  15.         http://www.springframework.org/schema/tx/spring-tx.xsd  

  16.         http://www.springframework.org/schema/mvc   

  17.         http://www.springframework.org/schema/mvc/spring-mvc.xsd">  

  18.           

  19.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  

  20.         <property name="securityManager" ref="securityManager" />  

  21.         <property name="loginUrl" value="/login.jsp" />  

  22.         <property name="successUrl" value="/login.jsp" />  

  23.         <property name="unauthorizedUrl" value="/error/noperms.jsp" />  

  24.           

  25.         <property name="filterChainDefinitions">  

  26.             <value>  

  27.                 /login.jsp* = anon  

  28.                 /login.do* = anon  

  29.                 /index.jsp*= anon  

  30.                 /error/noperms.jsp*= anon  

  31.                 /*.jsp* = authc  

  32.                 /*.do* = authc  

  33.             </value>  

  34.         </property>  

  35.     </bean>  

  36.       

  37.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  

  38.         <property name="realm" ref="monitorRealm" />  

  39.     </bean>  

  40.           

  41.     <bean id="monitorRealm" class="com.test.util.MonitorRealm"/>  

  42.       

  43.     <!-- securityManager -->  

  44.     <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  

  45.         <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />  

  46.         <property name="arguments" ref="securityManager" />  

  47.     </bean>  

  48.       

  49.     <!-- 保證實現了Shiro內部lifecycle函數的bean執行 -->  

  50.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  

  51.       

  52.     <!-- AOP式方法級權限檢查  -->  

  53.     <bean  

  54.     class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"  

  55.     depends-on="lifecycleBeanPostProcessor" />  

  56.       

  57.     <bean  

  58.     class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">  

  59.         <property name="securityManager" ref="securityManager" />  

  60.     </bean>  

  61.       

  62. </beans>  


web.xml

  1.  <filter>      

  2.        <filter-name>shiroFilter</filter-name>      

  3.        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>      

  4.        <init-param>      

  5.            <param-name>targetFilterLifecycle</param-name>      

  6.            <param-value>true</param-value>      

  7.        </init-param>      

  8.    </filter>   

  9. <filter-mapping>      

  10.        <filter-name>shiroFilter</filter-name>      

  11.        <url-pattern>*.do</url-pattern>      

  12.    </filter-mapping>      

  13.    <filter-mapping>      

  14.        <filter-name>shiroFilter</filter-name>      

  15.        <url-pattern>*.jsp</url-pattern>      

  16.    </filter-mapping>    



從<bean id="monitorRealm" class="com.test.util.MonitorRealm"/>可以看出 我們需要一個java類 來控制驗證,

  1. package com.test.util;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import javax.annotation.Resource;  

  7.   

  8. import org.apache.shiro.authc.AuthenticationException;  

  9. import org.apache.shiro.authc.AuthenticationInfo;  

  10. import org.apache.shiro.authc.AuthenticationToken;  

  11. import org.apache.shiro.authc.SimpleAuthenticationInfo;  

  12. import org.apache.shiro.authc.UsernamePasswordToken;  

  13. import org.apache.shiro.authz.AuthorizationException;  

  14. import org.apache.shiro.authz.AuthorizationInfo;  

  15. import org.apache.shiro.authz.SimpleAuthorizationInfo;  

  16. import org.apache.shiro.realm.AuthorizingRealm;  

  17. import org.apache.shiro.subject.PrincipalCollection;  

  18.   

  19. import com.test.dao.PermissionDao;  

  20. import com.test.dao.RoleDao;  

  21. import com.test.dao.UserDao;  

  22. import com.test.model.Permission;  

  23. import com.test.model.RoleBean;  

  24. import com.test.model.UserBean;  

  25.   

  26. public class MonitorRealm extends AuthorizingRealm{  

  27.   

  28.     @Resource(name="userDao")  

  29.     private UserDao userDao;  

  30.       

  31.     @Resource(name="roleDao")  

  32.     private RoleDao roleDao;  

  33.       

  34.     @Resource(name="permissionDao")  

  35.     private PermissionDao permissionDao;  

  36.       

  37.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  

  38.         String currentUsername = (String)super.getAvailablePrincipal(principals);  

  39.         UserBean user = userDao.findUserByName(currentUsername);  

  40.         List<String> roles = new ArrayList<String>();  

  41.         List<String> permissions = new ArrayList<String>();  

  42.           

  43.         if(null != user){    

  44.             List<RoleBean> list1 = roleDao.findLikeEntity(user.getId());  

  45.             if(null != list1 && !list1.isEmpty()){  

  46.                 for(RoleBean role:list1){  

  47.                     roles.add(role.getName());  

  48.                     List<Permission> list = permissionDao.findEntity(role.getId());  

  49.                     if(null != list && !list.isEmpty()){  

  50.                         for(Permission permission:list){  

  51.                             permissions.add(permission.getUrl());  

  52.                         }  

  53.                     }  

  54.                 }  

  55.             }  

  56.         }else{    

  57.             throw new AuthorizationException();    

  58.         }  

  59.         SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();    

  60.         simpleAuthorInfo.addRoles(roles);  

  61.         simpleAuthorInfo.addStringPermissions(permissions);    

  62.         //實際中可能會像上面註釋的那樣從數據庫取得    

  63.         if(null!=currentUsername && "admin".equals(currentUsername)){    

  64.             //添加一個角色,不是配置意義上的添加,而是證明該用戶擁有admin角色      

  65.             simpleAuthorInfo.addRole("admin");    

  66.             //添加權限    

  67.             simpleAuthorInfo.addStringPermission("admin:manage");    

  68.             System.out.println("已爲用戶[mike]賦予了[admin]角色和[admin:manage]權限");    

  69.             return simpleAuthorInfo;    

  70.         }  

  71.         //若該方法什麼都不做直接返回null的話,就會導致任何用戶訪問/admin/listUser.jsp時都會自動跳轉到unauthorizedUrl指定的地址    

  72.         //詳見applicationContext.xml中的<bean id="shiroFilter">的配置    

  73.         return null;    

  74.     }  

  75.   

  76.       

  77.       

  78.     protected AuthenticationInfo doGetAuthenticationInfo(  

  79.             AuthenticationToken authcToken) throws AuthenticationException {  

  80.         UsernamePasswordToken token = (UsernamePasswordToken) authcToken;  

  81.         UserBean user = new UserBean();  

  82.         user.setLoginName(token.getUsername());  

  83.         user.setPasswd(new String(token.getPassword()));  

  84.         List<UserBean> list = userDao.login(user);  

  85.         if(!list.isEmpty()){  

  86.             return  new SimpleAuthenticationInfo(user,    

  87.                     user.getPasswd().toCharArray(), getName());  

  88.         }  

  89.         return null;  

  90.     }  

  91.   

  92. }  


當你在login時

  1. @RequestMapping(value="login.do",method=RequestMethod.POST)  

  2.     public String login(UserBean user,HttpSession session,Model model){  

  3.         Subject currentUser = SecurityUtils.getSubject();    

  4.         UsernamePasswordToken token = new UsernamePasswordToken(    

  5.                 user.getLoginName(), user.getPasswd());    

  6.         token.setRememberMe(true);    

  7.         try {    

  8.             currentUser.login(token);    

  9.         } catch (AuthenticationException e) {  

  10.             model.addAttribute("status"1);  

  11.             return "error";  

  12.         }    

  13.         if(currentUser.isAuthenticated()){    

  14.             session.setAttribute("userinfo", user);    

  15.             return "page/index";  

  16.         }else{    

  17.             return "login";  

  18.         }    

  19.           

  20.     }  


currentUser.login(token);  就會調用 monitorRealm裏的doGetAuthenticationInfo方法


並將用戶名密碼傳遞過去。

數據庫查找,當用戶密碼正確時 

return new SimpleAuthenticationInfo(user, user.getPasswd().toCharArray(), getName());

否則 return null

return null 就會被catch到AuthenticationException

也有一種情況,就是 如果你沒有使用加密,然後你配置文件使用了加密配置了。

則會報一個Caused by: java.lang.IllegalArgumentException: Odd number of characters.的錯誤。

 框架/平臺構成:

Maven+Springmvc + Mybatis + Shiro(權限)+ Tiles(模板) +ActiveMQ(消息隊列) + Rest(服務) + WebService(服務)+ EHcache(緩存) + Quartz(定時調度)+ Html5(支持PC、IOS、Android)

用戶權限系統:
組織結構:角色、用戶、用戶組、組織機構;權限點:頁面、方法、按鈕、數據權限、分級授權

項目管理新體驗
快速出原型系統、組件樹、版本控制、模塊移植、協同開發、實時監控、發佈管理

可持續集成:
所有組件可移植、可定製、可擴充,開發成果不斷積累,形成可持續發展的良性循環

支持平臺平臺: 
Windows XP、Windows 7 、Windows 10 、 Linux 、 Unix

服務器容器:
Tomcat 5/6/7 、Jetty、JBoss、WebSphere 8.5 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客

 

JEESZ通用版本分佈式模塊化開發平臺 - zookeeperflume - zookeeperflume的博客


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章