2019独角兽企业重金招聘Python工程师标准>>>

  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. <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

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

shiro+springmvc+mybatis【转】相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> A.首先需要搭建SpringMVC+Shiro环境 a1.pom.xml配置  spring: <dependency& ...

  2. (五)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建根项目

    上一篇我们介绍<springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划>,从今天开始,我们将对代码的每一个构建做详细的记录,能够帮助大家 ...

  3. SpringMVC + MyBatis整合 【转】

    为什么80%的码农都做不了架构师?>>>    环境:spring3.1.1+mybatis3.2.8+mybatis-spring1.2.3 网络上关于这个架构的搭建文章,实在是太 ...

  4. 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构(附源码)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:zheng gitee ...

  5. Maven搭建SpringMVC+Mybatis项目详解【转】

    为什么80%的码农都做不了架构师?>>>    前言 最近比较闲,复习搭建一下项目,这次主要使用Spring+SpringMVC+Mybatis.项目持久层使用Mybatis3,控制 ...

  6. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点  一.Maven需要引入的jar包  二.Spring与SpringMVC的配置分离  三.Sp ...

  7. java quartz mybatisplus_Springboot+redis+SpringMVC+Mybatis Plus分布式开发系统源码

    先转发,后关注,然后私信"jee"即可获取源码下载地址 Springboot2.0+redis+SpringMVC+Spring+Mybatis+Mybatis Plus的Java ...

  8. springMVC mybatis 多数据源配置

    1.ssm(spring+springMVC+mybatis)环境搭建(略) 2.工程目录及多数据源涉及的文件 1).DataSourceContextHolder.java package com. ...

  9. 原创SpringMvc+Mybatis+Redis框架

    声明: 本人提供这个 SpringMVC + Mybatis + Redis 的Demo 本着学习的态度,如果有欠缺和不足的地方,给予指正,并且多多包涵. PS:最近发现Spring Boot十分火但 ...

  10. 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构zhen项目

    原项目链接:https://github.com/shuzheng/zheng 目前看过做完整的项目,大家一起学习一下,详情请点击原项目链接的地址 前言 zheng项目创建于2016年10月4日,正在 ...

最新文章

  1. 糊涂虫 php,糊涂虫 hat folgende Bedeutung
  2. linux内核学习之四:进程切换简述
  3. Roman to Integer - LeetCode
  4. linux centos7使用,linux之centos7防火墙基本使用
  5. 使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry
  6. leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
  7. visual studio 2010常用快捷键
  8. 原生js双向数据绑定
  9. 机器人带陀螺仪走钢丝_走直线很难吗?陀螺仪表示,少了它机器人连直线都走不了...
  10. RNN(3) ------ “blog:RNN学习之路”
  11. 移动端车牌识别,小功能大作用
  12. win10计算机属性快捷键,win 10 电脑常用快捷键汇总
  13. 内存颗粒和闪存颗粒的区别_闪存颗粒与内存颗粒的不同
  14. 腾讯地图基于 WebGL实现自定义栅格图层踩坑实录
  15. 学习笔记(5.7~5.10)——深度学习之回归(梯度下降法Gradient Descent)
  16. 32位系统为什么又叫x86系统呢?
  17. 华硕笔记本重装系统bios设置
  18. Java飞机大战小游戏练习
  19. BUUCTF [强网杯 2019]随便注
  20. 数据挖掘算法-时间序列

热门文章

  1. 建立完善的员工晋升机制_员工晋升机制(完)
  2. php pdo setfetchmode,PDOStatement::setFetchMode
  3. datagrid 重载本地数据_DataGrid 的DataSource重新加载数据
  4. electron 多语言_Electron实用技巧electronbuilder中用户协议(license)的使用及多语言支持...
  5. java编译是用javac吗_用java自带工具javac和java编译运行java程序
  6. 微服务esb_深入理解微服务架构:银弹or焦油坑?
  7. golang中字符串常用的命令
  8. 权御天下计算机音乐数字乐谱,权御天下(单音 适合电吉他)
  9. java反射加载类_Java反射 - 动态类加载和重载
  10. ids和ips主要区别在于_数控机床和普通机床的最主要的区别是在于什么,你知道吗?...