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. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  19. <property name="securityManager" ref="securityManager" />
  20. <property name="loginUrl" value="/login.jsp" />
  21. <property name="successUrl" value="/login.jsp" />
  22. <property name="unauthorizedUrl" value="/error/noperms.jsp" />
  23. <property name="filterChainDefinitions">
  24. <value>
  25. /login.jsp* = anon
  26. /login.do* = anon
  27. /index.jsp*= anon
  28. /error/noperms.jsp*= anon
  29. /*.jsp* = authc
  30. /*.do* = authc
  31. </value>
  32. </property>
  33. </bean>
  34. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  35. <property name="realm" ref="monitorRealm" />
  36. </bean>
  37. <bean id="monitorRealm" class="com.test.util.MonitorRealm"/>
  38. <!-- securityManager -->
  39. <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  40. <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />
  41. <property name="arguments" ref="securityManager" />
  42. </bean>
  43. <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  44. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
  45. <!-- AOP式方法级权限检查  -->
  46. <bean
  47. class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
  48. depends-on="lifecycleBeanPostProcessor" />
  49. <bean
  50. class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  51. <property name="securityManager" ref="securityManager" />
  52. </bean>
  53. </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. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.annotation.Resource;
  5. import org.apache.shiro.authc.AuthenticationException;
  6. import org.apache.shiro.authc.AuthenticationInfo;
  7. import org.apache.shiro.authc.AuthenticationToken;
  8. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  9. import org.apache.shiro.authc.UsernamePasswordToken;
  10. import org.apache.shiro.authz.AuthorizationException;
  11. import org.apache.shiro.authz.AuthorizationInfo;
  12. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  13. import org.apache.shiro.realm.AuthorizingRealm;
  14. import org.apache.shiro.subject.PrincipalCollection;
  15. import com.test.dao.PermissionDao;
  16. import com.test.dao.RoleDao;
  17. import com.test.dao.UserDao;
  18. import com.test.model.Permission;
  19. import com.test.model.RoleBean;
  20. import com.test.model.UserBean;
  21. public class MonitorRealm extends AuthorizingRealm{
  22. @Resource(name="userDao")
  23. private UserDao userDao;
  24. @Resource(name="roleDao")
  25. private RoleDao roleDao;
  26. @Resource(name="permissionDao")
  27. private PermissionDao permissionDao;
  28. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  29. String currentUsername = (String)super.getAvailablePrincipal(principals);
  30. UserBean user = userDao.findUserByName(currentUsername);
  31. List<String> roles = new ArrayList<String>();
  32. List<String> permissions = new ArrayList<String>();
  33. if(null != user){
  34. List<RoleBean> list1 = roleDao.findLikeEntity(user.getId());
  35. if(null != list1 && !list1.isEmpty()){
  36. for(RoleBean role:list1){
  37. roles.add(role.getName());
  38. List<Permission> list = permissionDao.findEntity(role.getId());
  39. if(null != list && !list.isEmpty()){
  40. for(Permission permission:list){
  41. permissions.add(permission.getUrl());
  42. }
  43. }
  44. }
  45. }
  46. }else{
  47. throw new AuthorizationException();
  48. }
  49. SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();
  50. simpleAuthorInfo.addRoles(roles);
  51. simpleAuthorInfo.addStringPermissions(permissions);
  52. //实际中可能会像上面注释的那样从数据库取得
  53. if(null!=currentUsername && "admin".equals(currentUsername)){
  54. //添加一个角色,不是配置意义上的添加,而是证明该用户拥有admin角色
  55. simpleAuthorInfo.addRole("admin");
  56. //添加权限
  57. simpleAuthorInfo.addStringPermission("admin:manage");
  58. System.out.println("已为用户[mike]赋予了[admin]角色和[admin:manage]权限");
  59. return simpleAuthorInfo;
  60. }
  61. //若该方法什么都不做直接返回null的话,就会导致任何用户访问/admin/listUser.jsp时都会自动跳转到unauthorizedUrl指定的地址
  62. //详见applicationContext.xml中的<bean id="shiroFilter">的配置
  63. return null;
  64. }
  65. protected AuthenticationInfo doGetAuthenticationInfo(
  66. AuthenticationToken authcToken) throws AuthenticationException {
  67. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
  68. UserBean user = new UserBean();
  69. user.setLoginName(token.getUsername());
  70. user.setPasswd(new String(token.getPassword()));
  71. List<UserBean> list = userDao.login(user);
  72. if(!list.isEmpty()){
  73. return  new SimpleAuthenticationInfo(user,
  74. user.getPasswd().toCharArray(), getName());
  75. }
  76. return null;
  77. }
  78. }

当你在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. }

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

时间: 2024-08-04 12:06:24

shiro+springmvc+mybatis【转】的相关文章

javaEE 后台框架 SpringMVC Mybatis Shiro Bootstrap HTML

升级报捷:通过服务于服务之间调用,生成二维码,可直接用户手机app(详细查看截图) 框架集成lucene搜索引擎,使您的信息在毫秒内抓取(详细查看截图) 1.  创建.初始化索引.统一搜索入口.搜索结果展现--内容.标题高亮.关键词搜索 2.  高级搜索:高级搜索增加多入口查询(精确查询.模糊查询.前缀查询等),每页显示条数自定义.索引结果数据设置.选择索引文档类型等 3. 通过A系统调用B系统的Rest服务,生成相关的二维码,可以直接用户手机app ----------------------

ehcache配置:使用Spring+SpringMVC+Mybatis或者有shiro【转】

SSM框架的搭建就不在叙述了 本文主要是讲解在SSM基础上再加上ehcache 1:首先:pom.xml需要的jar <dependency>   <groupId>org.mybatis</groupId>   <artifactId>mybatis-ehcache</artifactId>   <version>1.0.0</version>  </dependency>  <dependency&g

SpringMVC + Mybatis + Shiro 权限整合【转】

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/> , 否则controller无法使用注解. 这个方法可能避免使用sessionValidationScheduler, 就是避免使用, 就能使用高版本的quartz了. 配置会话监听: Java代码   package com.pandy.core.security.session;

SpringMVC Mybatis Shiro RestTemplate的实现客户端无状态验证及访问控制【转】

A.首先需要搭建SpringMVC+Shiro环境 a1.pom.xml配置 spring: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId>     <version>4.1.0.RELEASE</version> </dependency> <dependency>

java大数据 高并发 系统框架 springmvc mybatis Bootstrap html5 shiro maven SSM SSH

获取[下载地址]   QQ: 313596790   [免费支持更新]A 代码生成器(开发利器);全部是源码     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  Shiro 是一个用

分布式 dubbo zookeeper springmvc mybatis shiro restful redis fastdfs activemq

摘要: 摘要: SSH ++shiro+restful+bootstrap java架构 java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 分布式架构 分布式消息中间件:spring mvc +mybatis + KafKa+Flume+Zookeeper 分布式缓存:Redis spring mvc +mybatis + 分布式

springmvc,mybatis,shiro综合配置示例

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 htt

【企业框架源码】Springmvc+mybatis+shiro+restful+bootstrap

源码地址获取  1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问)2. 提供高并发JMS消息处理机制3. 所有功能模块化.所有模块服务化.所有服务原子化的方式,提供可拓展的服务模型,使程序稳定运行,永不宕机4. 提供Wink Rest.Webservice服务,故可作为独立服务平台部署 框架整合: Springmvc + Mybatis + Shiro(权限) + REST

系统框架 springmvc mybatis Bootstrap html5 shiro maven SS

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid