文档章节

shiro+springmvc+mybatis【转】

 如何让他和
发布于 2016/09/25 14:28
字数 1015
阅读 26
收藏 0

 

  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的博客

© 著作权归作者所有

粉丝 38
博文 72
码字总数 147957
作品 0
深圳
私信 提问
加载中

评论(1)

如何让他和 博主
SylixOS中AARCH64跳转表实现原理

跳转表存在的意义 1.1 内核模块反汇编 如下的程序清单,为一个内核模块的源码。 反汇编之后的内容如下所示。 从以上反汇编结果可知,printk函数调用会被汇编为BL指令,并且跳转的目的地址为0...

zhywxyy
2018/10/23
13
0
无论是菜鸟还是高手,这招PDF转Word技巧必须Get

PDF作为与平台无关的文本格式,是网络上进行电子文档发行的理想文档格式。但是PDF文档格式不利于编辑修改,为解决该问题,很多小伙伴第一时间想到把PDF转Word,今天小编为大家推荐一款非常强...

提提拉米苏
2018/07/16
3
0
云栖小编邀您一起,玩转云栖36计!

不知不觉,云栖社区已经陪伴广大开发者走过了三年,不知您是否遇到过这些尴尬的问题? 编辑博客文章却找不到在哪里插入图片 想申请直播,却一直找不到入口而最后放弃了直播 想成为专家,却不...

云栖直播~
04/24
0
0
JSP中四种属性范围(pageContext,request)

在JSP中提供了四种属性的保存范围,所谓的属性的保存范围,指的是一个设置的对象,可以在多少个页面中保存,并可以使用。 四种属性范围: ①pageContext:只在一个页面中保存属性,跳转后无效...

Bug-Killer
2016/02/20
86
0
云转码视频播放系统

1. 概述 随着视频分享站点的兴起,以及智能手机的流行,需要进行大量的离线视频转码工作,以适应异构网络和多终端环境的需要,为此我们在2009年着手开发视频转码平台(将各种格式的视频文件转...

点播直播云转码
2016/10/20
2.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部