原文链接:http://blog.csdn.net/qq_37936542/article/details/79010449

springmvc+shiro实现系统粗细粒度的权限管理步骤:

1:表格设计

2:配置maven依赖

3:web.xml配置shiro过滤器

4:web.xml引入applicationContext-shiro.xml的配置文件

5:配置applicationContext-shiro.xml配置文件

6:配置shiro缓存文件

7:自定义realm实现用户认证和授权

8:实现登录逻辑

9:页面控制权限

一:表格设计(一个用户对应一个系统角色,一个系统角色具有多个操作权限)

二:导入相关依赖 pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>debo</groupId>
  5. <artifactId>debo</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <spring.version>4.3.6.RELEASE</spring.version>
  11. </properties>
  12. <dependencies>
  13. <!-- 导入java ee jar 包 -->
  14. <dependency>
  15. <groupId>javax</groupId>
  16. <artifactId>javaee-api</artifactId>
  17. <version>6.0</version>
  18. <scope>provided</scope>
  19. </dependency>
  20. <dependency>
  21. <groupId>javax</groupId>
  22. <artifactId>javaee-web-api</artifactId>
  23. <version>6.0</version>
  24. <scope>provided</scope>
  25. </dependency>
  26. <dependency>
  27. <groupId>javax.servlet</groupId>
  28. <artifactId>servlet-api</artifactId>
  29. <version>2.5</version>
  30. <scope>provided</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>javax.servlet</groupId>
  34. <artifactId>jstl</artifactId>
  35. <version>1.2</version>
  36. </dependency>
  37. <!-- spring框架包 start -->
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-test</artifactId>
  41. <version>${spring.version}</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-core</artifactId>
  46. <version>${spring.version}</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>spring-oxm</artifactId>
  51. <version>${spring.version}</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-tx</artifactId>
  56. <version>${spring.version}</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-jdbc</artifactId>
  61. <version>${spring.version}</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>org.springframework</groupId>
  65. <artifactId>spring-aop</artifactId>
  66. <version>${spring.version}</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>org.springframework</groupId>
  70. <artifactId>spring-context</artifactId>
  71. <version>${spring.version}</version>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.springframework</groupId>
  75. <artifactId>spring-context-support</artifactId>
  76. <version>${spring.version}</version>
  77. </dependency>
  78. <dependency>
  79. <groupId>org.springframework</groupId>
  80. <artifactId>spring-expression</artifactId>
  81. <version>${spring.version}</version>
  82. </dependency>
  83. <dependency>
  84. <groupId>org.springframework</groupId>
  85. <artifactId>spring-orm</artifactId>
  86. <version>${spring.version}</version>
  87. </dependency>
  88. <dependency>
  89. <groupId>org.springframework</groupId>
  90. <artifactId>spring-web</artifactId>
  91. <version>${spring.version}</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.springframework</groupId>
  95. <artifactId>spring-webmvc</artifactId>
  96. <version>${spring.version}</version>
  97. </dependency>
  98. <dependency>
  99. <groupId>org.springframework</groupId>
  100. <artifactId>spring-websocket</artifactId>
  101. <version>${spring.version}</version>
  102. </dependency>
  103. <dependency>
  104. <groupId>org.aspectj</groupId>
  105. <artifactId>aspectjrt</artifactId>
  106. <version>1.8.10</version>
  107. </dependency>
  108. <dependency>
  109. <groupId>org.aspectj</groupId>
  110. <artifactId>aspectjweaver</artifactId>
  111. <version>1.6.12</version>
  112. </dependency>
  113. <dependency>
  114. <groupId>org.springframework</groupId>
  115. <artifactId>spring-messaging</artifactId>
  116. <version>${spring.version}</version>
  117. </dependency>
  118. <!-- spring框架包 end -->
  119. <!-- mybatis框架包 start -->
  120. <dependency>
  121. <groupId>org.mybatis</groupId>
  122. <artifactId>mybatis</artifactId>
  123. <version>3.3.0</version>
  124. </dependency>
  125. <dependency>
  126. <groupId>org.mybatis</groupId>
  127. <artifactId>mybatis-spring</artifactId>
  128. <version>1.3.0</version>
  129. </dependency>
  130. <!-- mybatis框架包 end -->
  131. <!-- shiro -->
  132. <dependency>
  133. <groupId>org.apache.shiro</groupId>
  134. <artifactId>shiro-core</artifactId>
  135. <version>1.3.2</version>
  136. </dependency>
  137. <dependency>
  138. <groupId>org.apache.shiro</groupId>
  139. <artifactId>shiro-web</artifactId>
  140. <version>1.3.2</version>
  141. </dependency>
  142. <dependency>
  143. <groupId>org.apache.shiro</groupId>
  144. <artifactId>shiro-spring</artifactId>
  145. <version>1.3.2</version>
  146. </dependency>
  147. <dependency>
  148. <groupId>org.apache.shiro</groupId>
  149. <artifactId>shiro-ehcache</artifactId>
  150. <version>1.3.2</version>
  151. </dependency>
  152. <!-- log4j -->
  153. <dependency>
  154. <groupId>log4j</groupId>
  155. <artifactId>log4j</artifactId>
  156. <version>1.2.16</version>
  157. </dependency>
  158. <!-- lang3 -->
  159. <dependency>
  160. <groupId>org.apache.commons</groupId>
  161. <artifactId>commons-lang3</artifactId>
  162. <version>3.6</version>
  163. </dependency>
  164. <!-- dhcp连接池 -->
  165. <dependency>
  166. <groupId>commons-dbcp</groupId>
  167. <artifactId>commons-dbcp</artifactId>
  168. <version>1.4</version>
  169. </dependency>
  170. <!-- MySql -->
  171. <dependency>
  172. <groupId>mysql</groupId>
  173. <artifactId>mysql-connector-java</artifactId>
  174. <version>5.1.38</version>
  175. </dependency>
  176. <!-- poi -->
  177. <dependency>
  178. <groupId>org.apache.poi</groupId>
  179. <artifactId>poi</artifactId>
  180. <version>3.17</version>
  181. </dependency>
  182. <dependency>
  183. <groupId>org.apache.poi</groupId>
  184. <artifactId>poi-ooxml-schemas</artifactId>
  185. <version>3.17</version>
  186. </dependency>
  187. <dependency>
  188. <groupId>org.apache.poi</groupId>
  189. <artifactId>poi-ooxml</artifactId>
  190. <version>3.17</version>
  191. </dependency>
  192. <!-- jack json -->
  193. <dependency>
  194. <groupId>com.fasterxml.jackson.core</groupId>
  195. <artifactId>jackson-core</artifactId>
  196. <version>2.7.3</version>
  197. </dependency>
  198. <dependency>
  199. <groupId>com.fasterxml.jackson.core</groupId>
  200. <artifactId>jackson-annotations</artifactId>
  201. <version>2.7.3</version>
  202. </dependency>
  203. <dependency>
  204. <groupId>com.fasterxml.jackson.core</groupId>
  205. <artifactId>jackson-databind</artifactId>
  206. <version>2.7.3</version>
  207. </dependency>
  208. <!-- commons-io -->
  209. <dependency>
  210. <groupId>commons-io</groupId>
  211. <artifactId>commons-io</artifactId>
  212. <version>2.4</version>
  213. </dependency>
  214. <dependency>
  215. <groupId>commons-fileupload</groupId>
  216. <artifactId>commons-fileupload</artifactId>
  217. <version>1.3.1</version>
  218. </dependency>
  219. </dependencies>
  220. <build>
  221. <plugins>
  222. <plugin>
  223. <artifactId>maven-compiler-plugin</artifactId>
  224. <version>2.3.2</version>
  225. <configuration>
  226. <source>1.7</source>
  227. <target>1.7</target>
  228. </configuration>
  229. </plugin>
  230. <plugin>
  231. <artifactId>maven-war-plugin</artifactId>
  232. <version>2.2</version>
  233. <configuration>
  234. <version>3.1</version>
  235. <failOnMissingWebXml>false</failOnMissingWebXml>
  236. </configuration>
  237. </plugin>
  238. </plugins>
  239. </build>
  240. </project>

三:web.xml配置shiro拦截器

  1. <!-- 这里的filter-name 要和spring 的applicationContext-shiro.xml 里的
  2. g.apache.shiro.spring.web.ShiroFilterFactoryBean 的bean name 相同 -->
  3. <filter>
  4. <filter-name>shiroFilter</filter-name>
  5. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  6. <init-param>
  7. <param-name>targetFilterLifecycle</param-name>
  8. <param-value>true</param-value>
  9. </init-param>
  10. </filter>
  11. <filter-mapping>
  12. <filter-name>shiroFilter</filter-name>
  13. <url-pattern>/*</url-pattern>
  14. </filter-mapping>

四:web.xml引入applicationContext-shiro.xml文件

  1. <!-- springmvc控制器 -->
  2. <servlet>
  3. <servlet-name>dispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 加载springmvc配置文件 -->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:spring/springmvc-servlet.xml,classpath:spring/applicationContext*.xml</param-value>
  9. </init-param>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>dispatcherServlet</servlet-name>
  14. <url-pattern>/</url-pattern>
  15. </servlet-mapping>

配置文件目录结构:


五:配置applicationContext-shiro.xml文件

  1. <!-- 配置shiro安全管理器 -->
  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  3. <property name="realm" ref="shiroDbRealm"/>
  4. <!-- 配置缓存 -->
  5. <property name="cacheManager" ref="cacheManager"/>
  6. </bean>
  7. <!-- 自定义的Realm:用于用户的认证和授权 -->
  8. <bean id="shiroDbRealm" class="com.debo.login.controller.ShiroDbRealm"/>
  9. <!-- 此bean要被web.xml引用,和web.xml中的filtername同名 -->
  10. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  11. <property name="securityManager" ref="securityManager"/>
  12. <property name="loginUrl" value="/login.jsp" /> <!-- 没有认证返回地址 -->
  13. <property name="unauthorizedUrl" value="/noPromission.jsp" /> <!-- 没有授权返回地址 -->
  14. <property name="filterChainDefinitions">
  15. <value>            <!-- **代表任意子目录 -->
  16. /css/** = anon
  17. /img/** = anon
  18. /js/** = anon
  19. /jsp/** = user
  20. /web/** = anon
  21. /**/**=user
  22. </value>
  23. </property>
  24. </bean>
  25. <!-- 用户授权/认证信息Cache, 采用EhCache  缓存 -->
  26. <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
  27. <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
  28. </bean>
  29. <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  30. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

六:配置ehcache-shiro.xml文件

  1. <ehcache updateCheck="false" name="shiroCache">
  2. <defaultCache
  3. maxElementsInMemory="10000"
  4. eternal="false"
  5. timeToIdleSeconds="120"
  6. timeToLiveSeconds="120"
  7. overflowToDisk="false"
  8. diskPersistent="false"
  9. diskExpiryThreadIntervalSeconds="120"
  10. />
  11. </ehcache>

七:自定义realm AuthRealm

  1. package com.debo.login.controller;
  2. import java.util.List;
  3. import org.apache.shiro.authc.AuthenticationException;
  4. import org.apache.shiro.authc.AuthenticationInfo;
  5. import org.apache.shiro.authc.AuthenticationToken;
  6. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  7. import org.apache.shiro.authc.UsernamePasswordToken;
  8. import org.apache.shiro.authz.AuthorizationInfo;
  9. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  10. import org.apache.shiro.realm.AuthorizingRealm;
  11. import org.apache.shiro.subject.PrincipalCollection;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import com.debo.security.pojo.User;
  14. import com.debo.security.service.RoleService;
  15. import com.debo.security.service.UserService;
  16. public class ShiroDbRealm extends AuthorizingRealm {
  17. @Autowired
  18. private UserService userService;
  19. @Autowired
  20. private RoleService roleService;
  21. /**
  22. * shiro认证
  23. */
  24. @Override
  25. protected AuthenticationInfo doGetAuthenticationInfo(
  26. AuthenticationToken authcToken) throws AuthenticationException {
  27. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
  28. String loginName = token.getUsername();
  29. if (loginName != null && !"".equals(loginName)) {
  30. // 通過登录名获取用户
  31. User user = userService.getUserByLoginName(loginName);
  32. if (user != null) {
  33. // 如果身份认证验证成功,返回一个AuthenticationInfo实现
  34. return new SimpleAuthenticationInfo(user.getLoginName(),
  35. user.getPassword(), getName());
  36. }
  37. }
  38. return null;
  39. }
  40. /**
  41. * shiro授权
  42. */
  43. @Override
  44. protected AuthorizationInfo doGetAuthorizationInfo(
  45. PrincipalCollection principals) {
  46. String loginName = (String) getAvailablePrincipal(principals); // 使用Shiro提供的方法获取用户名称
  47. if (loginName != null) {
  48. String roleId = userService.getRoleIdByLoginName(loginName);
  49. // 获取用户的权限
  50. List<String> permTokens = roleService.getPermTokens(roleId);
  51. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  52. if (roleId != null) {
  53. info.addRole(roleId); // 加入用户角色
  54. }
  55. if (permTokens != null) {
  56. info.addStringPermissions(permTokens); // 加入用户许可标记
  57. }
  58. return info;
  59. }
  60. return null;
  61. }
  62. }


八:书写登录逻辑

  1. package com.debo.login.controller;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpSession;
  4. import org.apache.shiro.SecurityUtils;
  5. import org.apache.shiro.authc.AuthenticationException;
  6. import org.apache.shiro.authc.UsernamePasswordToken;
  7. import org.apache.shiro.subject.Subject;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.context.ContextLoader;
  13. import org.springframework.web.context.WebApplicationContext;
  14. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  15. import com.debo.company.service.CompanyService;
  16. import com.debo.develop.service.MenuService;
  17. import com.debo.security.pojo.User;
  18. import com.debo.security.service.UserService;
  19. @Controller
  20. @RequestMapping("/login")
  21. public class LoginController {
  22. @Autowired
  23. private MenuService menuService;
  24. @Autowired
  25. private UserService userService;
  26. @Autowired
  27. private CompanyService companyService;
  28. @RequestMapping(method = {RequestMethod.GET})
  29. public String login(HttpServletRequest request) {
  30. System.out.println("欢迎登陆!……");
  31. return "/login";
  32. }
  33. @RequestMapping(method = {RequestMethod.POST})
  34. public String loginPost(User user, RedirectAttributes redirectAttributes, HttpServletRequest request) {
  35. Subject currentUser = SecurityUtils.getSubject();
  36. UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginName(), user.getPassword(), user.isRememberMe());
  37. try {
  38. //用户认证
  39. currentUser.login(token);
  40. } catch (AuthenticationException e) {
  41. System.out.println(e);
  42. redirectAttributes.addFlashAttribute("message", "用户名或密码错误!");
  43. return "redirect:/login";
  44. }
  45. if (currentUser.isAuthenticated()) {
  46. //登录成功,保存用户相关信息
  47. sessionHandle(user, request);
  48. //跳转成功页面
  49. return "redirect:/index";
  50. } else {
  51. redirectAttributes.addFlashAttribute("message", "用户名或密码错误!");
  52. return "redirect:/login";
  53. }
  54. }
  55. private void sessionHandle(User user, HttpServletRequest request) {
  56. HttpSession session = request.getSession();
  57. User loginUser = userService.getUserByLoginName(user.getLoginName());
  58. if(loginUser != null){
  59. session.setAttribute("companyId", loginUser.getCompanyId());
  60. session.setAttribute("username", loginUser.getNickName());
  61. session.setAttribute("userId", loginUser.getId());
  62. }
  63. //menuService.updateMenuInSession(request);
  64. }
  65. }

九:jsp页面控制权限

  1. <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%><!-- 导入标签库  -->
  2. <!-- 如果用户有deleteUser的权限 则显示删除 -->
  3. <shiro:hasPermission name="deleteUser">
  4. <span id="delete" onclick="delete(this)">删除</span>
  5. </shiro:hasPermission>

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等8G资源合集大放送:https://www.jianshu.com/p/e8197d4d9880

福利二:微信小程序入门与实战全套详细视频教程

领取方式:
如果需要学习视频,欢迎关注 【编程微刊】微信公众号,回复【领取资源】一键领取以下所有干货资源,获取更多有用技术干货、文档资料。所有文档会持续更新,欢迎关注一起成长!

Springmvc+Shiro实战的更多相关文章

  1. SpringMVC+Shiro权限管理(转载)

    源码 http://pan.baidu.com/s/1pJzG4t1 SpringMVC+Shiro权限管理 博文目录 权限的简单描述 实例表结构及内容及POJO Shiro-pom.xml Shir ...

  2. springmvc+shiro+freemarker实现的安全及权限管理

    本文讲述了基于springmvc+shiro实现安全管理,shiro+freemarker实现权限验证. 首先我们从web.xml开始: <?xml version="1.0" ...

  3. Shiro实战教程-刘志敏-专题视频课程

    Shiro实战教程-62人已学习 课程介绍        本教程只介绍基本的 Shiro 使用,不会过多分析源码等,重在使用. 适用人群: 1.了解基于Servlet进行Web应用开发 2.了解Spr ...

  4. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  5. SpringMVC+Shiro权限管理

    什么是权限呢?举个简单的例子: 我有一个论坛,注册的用户分为normal用户,manager用户.对论坛的帖子的操作有这些:添加,删除,更新,查看,回复我们规定:normal用户只能:添加,查看,回复 ...

  6. SiteMesh, SpringMVC, Shiro 配置

    1. 首先在在web.xml文件中,加入SiteMesh和shiro的过滤器,保证SiteMesh的过滤器配置放在shiro的过滤器后面,不然的话,shiro的标签不能正确处理. <?xml v ...

  7. spring-mvc + shiro框架整合(sonne_game网站开发04)

    这篇文章讲的内容是在之前spring + mybatis + spring-mvc + freemarker框架整合的代码的基础上.有需要的可以看看我博客的前两篇文章. 另外,本文章所讲相关所有代码都 ...

  8. SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证

    序: 在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证. 教学: 一.Shiro配置的简要说明. 有心人可能注意到了,在上一章的applicationCo ...

  9. SpringMVC+Shiro不拦截静态资源配置

    最近在弄SpringMVC与Shiro整合,发现如果将DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果DispatcherServlet改为拦截“/” ...

随机推荐

  1. Codefroces 760 B. Frodo and pillows

    B. Frodo and pillows time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. Switchover and Failover说明

    SWITCHOVER Switchover是有计划的将primary切换为standby,standby切换为primary.在主库结束生产后,备库应用完所有主库archivelog或者redo lo ...

  3. vim学习3

    可视模式:

  4. windows服务插件利器-新生命组件XAgent使用心得

    1.简单介绍 XAgent为大石头带领下的新生命团队自己开发的一个.Net下的常用的Windows服务管理组件利器,通过在控制台中简单的输入1,2,3,4,5等数字可以实现一步安装.卸载Windows ...

  5. 洛谷——U10206 Cx的治疗

    https://www.luogu.org/problem/show?pid=U10206 题目背景 「Cx的故事」众所周知,Cx是一个宇宙大犇.由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大 ...

  6. 洛谷—— P1118 [USACO06FEB]数字三角形Backward Digit Su…

    https://www.luogu.org/problem/show?pid=1118#sub 题目描述 FJ and his cows enjoy playing a mental game. Th ...

  7. 学习笔记:mpvue开发小程序——入门

    接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...

  8. .netcore下的微服务、容器、运维、自动化发布

    原文:.netcore下的微服务.容器.运维.自动化发布 微服务 1.1     基本概念 1.1.1       什么是微服务? 微服务架构是SOA思想某一种具体实现.是一种将单应用程序作为一套小型 ...

  9. 【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules

    [链接]h在这里写链接 [题意] 在这里写题意 [题解]     dp[i][0] 第i个位置,bob没有决策权     dp[i][1] 第i个位置,bob有决策权     dp[n][0] = 0 ...

  10. IDEACould not autowire. No beans of 'xxxMapper' type found.

    作为一名刚开始使用idea的新手,最近在使用maven+springMVC框架时遇到了这样一个问题:Could not autowire. No beans of 'xxxMapper' type f ...