首页 > 代码库 > shiro+springmvc+mybatis【转】

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=http://www.mamicode.com/"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 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享


shiro+springmvc+mybatis【转】