shiro+springmvc+mybatis【转】
2019独角兽企业重金招聘Python工程师标准>>>
- <span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">
- </span>
- 一直以来,从开发到现在,都还没自己研究过权限控制。问了老大,老大让我学习shiro。
- <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
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd">
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <property name="loginUrl" value="/login.jsp" />
- <property name="successUrl" value="/login.jsp" />
- <property name="unauthorizedUrl" value="/error/noperms.jsp" />
- <property name="filterChainDefinitions">
- <value>
- /login.jsp* = anon
- /login.do* = anon
- /index.jsp*= anon
- /error/noperms.jsp*= anon
- /*.jsp* = authc
- /*.do* = authc
- </value>
- </property>
- </bean>
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="monitorRealm" />
- </bean>
- <bean id="monitorRealm" class="com.test.util.MonitorRealm"/>
- <!-- securityManager -->
- <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />
- <property name="arguments" ref="securityManager" />
- </bean>
- <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
- <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
- <!-- AOP式方法级权限检查 -->
- <bean
- class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
- depends-on="lifecycleBeanPostProcessor" />
- <bean
- class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
- <property name="securityManager" ref="securityManager" />
- </bean>
- </beans>
web.xml
- <filter>
- <filter-name>shiroFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetFilterLifecycle</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>shiroFilter</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>shiroFilter</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
从<bean id="monitorRealm" class="com.test.util.MonitorRealm"/>可以看出 我们需要一个java类 来控制验证,认证
- package com.test.util;
- import java.util.ArrayList;
- import java.util.List;
- import javax.annotation.Resource;
- import org.apache.shiro.authc.AuthenticationException;
- import org.apache.shiro.authc.AuthenticationInfo;
- import org.apache.shiro.authc.AuthenticationToken;
- import org.apache.shiro.authc.SimpleAuthenticationInfo;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.authz.AuthorizationException;
- import org.apache.shiro.authz.AuthorizationInfo;
- import org.apache.shiro.authz.SimpleAuthorizationInfo;
- import org.apache.shiro.realm.AuthorizingRealm;
- import org.apache.shiro.subject.PrincipalCollection;
- import com.test.dao.PermissionDao;
- import com.test.dao.RoleDao;
- import com.test.dao.UserDao;
- import com.test.model.Permission;
- import com.test.model.RoleBean;
- import com.test.model.UserBean;
- public class MonitorRealm extends AuthorizingRealm{
- @Resource(name="userDao")
- private UserDao userDao;
- @Resource(name="roleDao")
- private RoleDao roleDao;
- @Resource(name="permissionDao")
- private PermissionDao permissionDao;
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- String currentUsername = (String)super.getAvailablePrincipal(principals);
- UserBean user = userDao.findUserByName(currentUsername);
- List<String> roles = new ArrayList<String>();
- List<String> permissions = new ArrayList<String>();
- if(null != user){
- List<RoleBean> list1 = roleDao.findLikeEntity(user.getId());
- if(null != list1 && !list1.isEmpty()){
- for(RoleBean role:list1){
- roles.add(role.getName());
- List<Permission> list = permissionDao.findEntity(role.getId());
- if(null != list && !list.isEmpty()){
- for(Permission permission:list){
- permissions.add(permission.getUrl());
- }
- }
- }
- }
- }else{
- throw new AuthorizationException();
- }
- SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();
- simpleAuthorInfo.addRoles(roles);
- simpleAuthorInfo.addStringPermissions(permissions);
- //实际中可能会像上面注释的那样从数据库取得
- if(null!=currentUsername && "admin".equals(currentUsername)){
- //添加一个角色,不是配置意义上的添加,而是证明该用户拥有admin角色
- simpleAuthorInfo.addRole("admin");
- //添加权限
- simpleAuthorInfo.addStringPermission("admin:manage");
- System.out.println("已为用户[mike]赋予了[admin]角色和[admin:manage]权限");
- return simpleAuthorInfo;
- }
- //若该方法什么都不做直接返回null的话,就会导致任何用户访问/admin/listUser.jsp时都会自动跳转到unauthorizedUrl指定的地址
- //详见applicationContext.xml中的<bean id="shiroFilter">的配置
- return null;
- }
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken authcToken) throws AuthenticationException {
- UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
- UserBean user = new UserBean();
- user.setLoginName(token.getUsername());
- user.setPasswd(new String(token.getPassword()));
- List<UserBean> list = userDao.login(user);
- if(!list.isEmpty()){
- return new SimpleAuthenticationInfo(user,
- user.getPasswd().toCharArray(), getName());
- }
- return null;
- }
- }
当你在login
- @RequestMapping(value="login.do",method=RequestMethod.POST)
- public String login(UserBean user,HttpSession session,Model model){
- Subject currentUser = SecurityUtils.getSubject();
- UsernamePasswordToken token = new UsernamePasswordToken(
- user.getLoginName(), user.getPasswd());
- token.setRememberMe(true);
- try {
- currentUser.login(token);
- } catch (AuthenticationException e) {
- model.addAttribute("status", 1);
- return "error";
- }
- if(currentUser.isAuthenticated()){
- session.setAttribute("userinfo", user);
- return "page/index";
- }else{
- return "login";
- }
- }
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【转】相关推荐
- SpringMVC Mybatis Shiro RestTemplate的实现客户端无状态验证及访问控制【转】
2019独角兽企业重金招聘Python工程师标准>>> A.首先需要搭建SpringMVC+Shiro环境 a1.pom.xml配置 spring: <dependency& ...
- (五)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建根项目
上一篇我们介绍<springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划>,从今天开始,我们将对代码的每一个构建做详细的记录,能够帮助大家 ...
- SpringMVC + MyBatis整合 【转】
为什么80%的码农都做不了架构师?>>> 环境:spring3.1.1+mybatis3.2.8+mybatis-spring1.2.3 网络上关于这个架构的搭建文章,实在是太 ...
- 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构(附源码)
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:zheng gitee ...
- Maven搭建SpringMVC+Mybatis项目详解【转】
为什么80%的码农都做不了架构师?>>> 前言 最近比较闲,复习搭建一下项目,这次主要使用Spring+SpringMVC+Mybatis.项目持久层使用Mybatis3,控制 ...
- Spring+SpringMVC+MyBatis+Maven框架整合
本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sp ...
- java quartz mybatisplus_Springboot+redis+SpringMVC+Mybatis Plus分布式开发系统源码
先转发,后关注,然后私信"jee"即可获取源码下载地址 Springboot2.0+redis+SpringMVC+Spring+Mybatis+Mybatis Plus的Java ...
- springMVC mybatis 多数据源配置
1.ssm(spring+springMVC+mybatis)环境搭建(略) 2.工程目录及多数据源涉及的文件 1).DataSourceContextHolder.java package com. ...
- 原创SpringMvc+Mybatis+Redis框架
声明: 本人提供这个 SpringMVC + Mybatis + Redis 的Demo 本着学习的态度,如果有欠缺和不足的地方,给予指正,并且多多包涵. PS:最近发现Spring Boot十分火但 ...
- 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构zhen项目
原项目链接:https://github.com/shuzheng/zheng 目前看过做完整的项目,大家一起学习一下,详情请点击原项目链接的地址 前言 zheng项目创建于2016年10月4日,正在 ...
最新文章
- 糊涂虫 php,糊涂虫 hat folgende Bedeutung
- linux内核学习之四:进程切换简述
- Roman to Integer - LeetCode
- linux centos7使用,linux之centos7防火墙基本使用
- 使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry
- leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
- visual studio 2010常用快捷键
- 原生js双向数据绑定
- 机器人带陀螺仪走钢丝_走直线很难吗?陀螺仪表示,少了它机器人连直线都走不了...
- RNN(3) ------ “blog:RNN学习之路”
- 移动端车牌识别,小功能大作用
- win10计算机属性快捷键,win 10 电脑常用快捷键汇总
- 内存颗粒和闪存颗粒的区别_闪存颗粒与内存颗粒的不同
- 腾讯地图基于 WebGL实现自定义栅格图层踩坑实录
- 学习笔记(5.7~5.10)——深度学习之回归(梯度下降法Gradient Descent)
- 32位系统为什么又叫x86系统呢?
- 华硕笔记本重装系统bios设置
- Java飞机大战小游戏练习
- BUUCTF [强网杯 2019]随便注
- 数据挖掘算法-时间序列
热门文章
- 建立完善的员工晋升机制_员工晋升机制(完)
- php pdo setfetchmode,PDOStatement::setFetchMode
- datagrid 重载本地数据_DataGrid 的DataSource重新加载数据
- electron 多语言_Electron实用技巧electronbuilder中用户协议(license)的使用及多语言支持...
- java编译是用javac吗_用java自带工具javac和java编译运行java程序
- 微服务esb_深入理解微服务架构:银弹or焦油坑?
- golang中字符串常用的命令
- 权御天下计算机音乐数字乐谱,权御天下(单音 适合电吉他)
- java反射加载类_Java反射 - 动态类加载和重载
- ids和ips主要区别在于_数控机床和普通机床的最主要的区别是在于什么,你知道吗?...