shiro+springmvc+mybatis【转】

 

  1. <span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">  
  2. </span>  
  3. 一直以来,从开发到现在,都还没自己研究过权限控制。问了老大,老大让我学习shiro。  
  4. <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的博客

转载于:https://my.oschina.net/gdfgehre/blog/751352

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值