SpringMVC+Shiro權限管理

SpringMVC+Shiro權限管理

?

?什么是權限呢?舉個簡單的例子:

我有一個論壇,注冊的用戶分為normal用戶,manager用戶。
對論壇的帖子的操作有這些:
添加,刪除,更新,查看,回復
我們規定:
normal用戶只能:添加,查看,回復
manager用戶可以:刪除,更新

normal,manager對應的是角色(role)
添加,刪除,更新等對應的是權限(permission)

我們采用下面的邏輯創建權限表結構(不是絕對的,根據需要修改)

一個用戶可以有多種角色(normal,manager,admin等等)
一個角色可以有多個用戶(user1,user2,user3等等)
一個角色可以有多個權限(save,update,delete,query等等)
一個權限只屬于一個角色(delete只屬于manager角色)



?

?我們創建四張表:
t_user用戶表:設置了3個用戶
-------------------------------
id + username???+ password
---+----------------+----------
1??+???tom ? ? ? ? ? +??000000
2??+???jack ? ? ? ? ? +??000000
3??+???rose ? ? ? ? ?+??000000
---------------------------------
t_role角色表:設置3個角色
--------------
id + rolename?
---+----------
1??+ admin
2??+ manager
3??+ normal
--------------
t_user_role用戶角色表:tom是admin和normal角色,jack是manager和normal角色,rose是normal角色
---------------------
user_id??+??role_id
-----------+-----------
1 ? ? ? ? ? ?+ ? ? 1
1 ? ? ? ? ? ?+ ? ? 3
2 ? ? ? ? ? ?+ ? ? 2
2 ? ? ? ? ? ?+ ? ? 3
3 ? ? ? ? ? ?+ ? ? 3
---------------------
t_permission權限表:admin角色可以刪除,manager角色可以添加和更新,normal角色可以查看
-----------------------------------
id??+??permissionname??+??role_id
----+------------------------+-----------
1???+???add ? ? ? ? ? ? ? ? ? ? + ? ? 2
2???+???del ? ? ? ? ? ? ? ? ? ? ? + ? ?1
3???+???update ? ? ? ? ? ? ? ?+ ? ? 2
4???+???query ? ? ? ? ? ? ? ? ? + ? ?3
-----------------------------------

?

?建立對應的POJO:

Java代碼??
  1. package?com.cn.pojo;??
  2. ??
  3. import?java.util.HashSet;??
  4. import?java.util.List;??
  5. import?java.util.Set;??
  6. ??
  7. import?javax.persistence.Entity;??
  8. import?javax.persistence.GeneratedValue;??
  9. import?javax.persistence.GenerationType;??
  10. import?javax.persistence.Id;??
  11. import?javax.persistence.JoinColumn;??
  12. import?javax.persistence.JoinTable;??
  13. import?javax.persistence.ManyToMany;??
  14. import?javax.persistence.Table;??
  15. import?javax.persistence.Transient;??
  16. ??
  17. import?org.hibernate.validator.constraints.NotEmpty;??
  18. ??
  19. @Entity??
  20. @Table(name="t_user")??
  21. public?class?User?{??
  22. ??
  23. ????private?Integer?id;??
  24. ????@NotEmpty(message="用戶名不能為空")??
  25. ????private?String?username;??
  26. ????@NotEmpty(message="密碼不能為空")??
  27. ????private?String?password;??
  28. ????private?List<Role>?roleList;//一個用戶具有多個角色??
  29. ??????
  30. ????@Id??
  31. ????@GeneratedValue(strategy=GenerationType.IDENTITY)??
  32. ????public?Integer?getId()?{??
  33. ????????return?id;??
  34. ????}??
  35. ????public?void?setId(Integer?id)?{??
  36. ????????this.id?=?id;??
  37. ????}??
  38. ????public?String?getUsername()?{??
  39. ????????return?username;??
  40. ????}??
  41. ????public?void?setUsername(String?username)?{??
  42. ????????this.username?=?username;??
  43. ????}??
  44. ????public?String?getPassword()?{??
  45. ????????return?password;??
  46. ????}??
  47. ????public?void?setPassword(String?password)?{??
  48. ????????this.password?=?password;??
  49. ????}??
  50. ????@ManyToMany??
  51. ????@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},inverseJoinColumns={@JoinColumn(name="role_id")})??
  52. ????public?List<Role>?getRoleList()?{??
  53. ????????return?roleList;??
  54. ????}??
  55. ????public?void?setRoleList(List<Role>?roleList)?{??
  56. ????????this.roleList?=?roleList;??
  57. ????}??
  58. ??????
  59. ????@Transient??
  60. ????public?Set<String>?getRolesName(){??
  61. ????????List<Role>?roles=getRoleList();??
  62. ????????Set<String>?set=new?HashSet<String>();??
  63. ????????for?(Role?role?:?roles)?{??
  64. ????????????set.add(role.getRolename());??
  65. ????????}??
  66. ????????return?set;??
  67. ????}??
  68. ??????
  69. }??

?

Java代碼??
  1. package?com.cn.pojo;??
  2. ??
  3. import?java.util.ArrayList;??
  4. import?java.util.List;??
  5. ??
  6. import?javax.persistence.Entity;??
  7. import?javax.persistence.GeneratedValue;??
  8. import?javax.persistence.GenerationType;??
  9. import?javax.persistence.Id;??
  10. import?javax.persistence.JoinColumn;??
  11. import?javax.persistence.JoinTable;??
  12. import?javax.persistence.ManyToMany;??
  13. import?javax.persistence.OneToMany;??
  14. import?javax.persistence.Table;??
  15. import?javax.persistence.Transient;??
  16. ??
  17. @Entity??
  18. @Table(name="t_role")??
  19. public?class?Role?{??
  20. ??
  21. ????private?Integer?id;??
  22. ????private?String?rolename;??
  23. ????private?List<Permission>?permissionList;//一個角色對應多個權限??
  24. ????private?List<User>?userList;//一個角色對應多個用戶??
  25. ??????
  26. ????@Id??
  27. ????@GeneratedValue(strategy=GenerationType.IDENTITY)??
  28. ????public?Integer?getId()?{??
  29. ????????return?id;??
  30. ????}??
  31. ????public?void?setId(Integer?id)?{??
  32. ????????this.id?=?id;??
  33. ????}??
  34. ????public?String?getRolename()?{??
  35. ????????return?rolename;??
  36. ????}??
  37. ????public?void?setRolename(String?rolename)?{??
  38. ????????this.rolename?=?rolename;??
  39. ????}??
  40. ????@OneToMany(mappedBy="role")??
  41. ????public?List<Permission>?getPermissionList()?{??
  42. ????????return?permissionList;??
  43. ????}??
  44. ????public?void?setPermissionList(List<Permission>?permissionList)?{??
  45. ????????this.permissionList?=?permissionList;??
  46. ????}??
  47. ????@ManyToMany??
  48. ????@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})??
  49. ????public?List<User>?getUserList()?{??
  50. ????????return?userList;??
  51. ????}??
  52. ????public?void?setUserList(List<User>?userList)?{??
  53. ????????this.userList?=?userList;??
  54. ????}??
  55. ??????
  56. ????@Transient??
  57. ????public?List<String>?getPermissionsName(){??
  58. ????????List<String>?list=new?ArrayList<String>();??
  59. ????????List<Permission>?perlist=getPermissionList();??
  60. ????????for?(Permission?per?:?perlist)?{??
  61. ????????????list.add(per.getPermissionname());??
  62. ????????}??
  63. ????????return?list;??
  64. ????}??
  65. }??

?

Java代碼??
  1. package?com.cn.pojo;??
  2. ??
  3. import?javax.persistence.Entity;??
  4. import?javax.persistence.GeneratedValue;??
  5. import?javax.persistence.GenerationType;??
  6. import?javax.persistence.Id;??
  7. import?javax.persistence.JoinColumn;??
  8. import?javax.persistence.ManyToOne;??
  9. import?javax.persistence.Table;??
  10. ??
  11. @Entity??
  12. @Table(name="t_permission")??
  13. public?class?Permission?{??
  14. ??
  15. ????private?Integer?id;??
  16. ????private?String?permissionname;??
  17. ????private?Role?role;//一個權限對應一個角色??
  18. ??????
  19. ????@Id??
  20. ????@GeneratedValue(strategy=GenerationType.IDENTITY)??
  21. ????public?Integer?getId()?{??
  22. ????????return?id;??
  23. ????}??
  24. ????public?void?setId(Integer?id)?{??
  25. ????????this.id?=?id;??
  26. ????}??
  27. ????public?String?getPermissionname()?{??
  28. ????????return?permissionname;??
  29. ????}??
  30. ????public?void?setPermissionname(String?permissionname)?{??
  31. ????????this.permissionname?=?permissionname;??
  32. ????}??
  33. ????@ManyToOne??
  34. ????@JoinColumn(name="role_id")??
  35. ????public?Role?getRole()?{??
  36. ????????return?role;??
  37. ????}??
  38. ????public?void?setRole(Role?role)?{??
  39. ????????this.role?=?role;??
  40. ????}??
  41. ??????
  42. }??

?

?使用SHIRO的步驟:
1,導入jar
2,配置web.xml
3,建立dbRelm
4,在Spring中配置

pom.xml中配置如下:

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/maven-v4_0_0.xsd">??
  3. ??<modelVersion>4.0.0</modelVersion>??
  4. ??<groupId>com.hyx</groupId>??
  5. ??<artifactId>springmvc</artifactId>??
  6. ??<packaging>war</packaging>??
  7. ??<version>0.0.1-SNAPSHOT</version>??
  8. ??<name>springmvc?Maven?Webapp</name>??
  9. ??<url>http://maven.apache.org</url>??
  10. ??<dependencies>??
  11. ????<dependency>??
  12. ??????<groupId>junit</groupId>??
  13. ??????<artifactId>junit</artifactId>??
  14. ??????<version>3.8.1</version>??
  15. ??????<scope>test</scope>??
  16. ????</dependency>??
  17. ????<!--?SpringMVC核心jar?-->??
  18. ????<dependency>??
  19. ????????<groupId>org.springframework</groupId>??
  20. ????????<artifactId>spring-webmvc</artifactId>??
  21. ????????<version>3.2.4.RELEASE</version>??
  22. ????</dependency>??
  23. ????<!--?springmvc連接數據庫需要的jar?-->??
  24. ????<dependency>??
  25. ????????<groupId>org.springframework</groupId>??
  26. ????????<artifactId>spring-jdbc</artifactId>??
  27. ????????<version>3.2.4.RELEASE</version>??
  28. ????</dependency>??
  29. ????<dependency>??
  30. ????????<groupId>org.springframework</groupId>??
  31. ????????<artifactId>spring-orm</artifactId>??
  32. ????????<version>3.2.4.RELEASE</version>??
  33. ????</dependency>??
  34. ????<!--?************************************?-->??
  35. ????<!--?Hibernate相關jar?-->??
  36. ????<dependency>??
  37. ????????<groupId>org.hibernate</groupId>??
  38. ????????<artifactId>hibernate-core</artifactId>??
  39. ????????<version>4.2.5.Final</version>??
  40. ????</dependency>??
  41. ????<dependency>??
  42. ????????<groupId>org.hibernate</groupId>??
  43. ????????<artifactId>hibernate-ehcache</artifactId>??
  44. ????????<version>4.2.5.Final</version>??
  45. ????</dependency>??
  46. ????<dependency>??
  47. ????????<groupId>net.sf.ehcache</groupId>??
  48. ????????<artifactId>ehcache</artifactId>??
  49. ????????<version>2.7.2</version>??
  50. ????</dependency>??
  51. ????<dependency>??
  52. ????????<groupId>commons-dbcp</groupId>??
  53. ????????<artifactId>commons-dbcp</artifactId>??
  54. ????????<version>1.4</version>??
  55. ????</dependency>??
  56. ????<dependency>??
  57. ????????<groupId>mysql</groupId>??
  58. ????????<artifactId>mysql-connector-java</artifactId>??
  59. ????????<version>5.1.26</version>??
  60. ????</dependency>??
  61. ????<!--?javax提供的annotation?-->??
  62. ????<dependency>??
  63. ????????<groupId>javax.inject</groupId>??
  64. ????????<artifactId>javax.inject</artifactId>??
  65. ????????<version>1</version>??
  66. ????</dependency>??????????
  67. ????<!--?****************************?-->??
  68. ??????
  69. ????<!--?hibernate驗證?-->??
  70. ????<dependency>??
  71. ????????<groupId>org.hibernate</groupId>??
  72. ????????<artifactId>hibernate-validator</artifactId>??
  73. ????????<version>5.0.1.Final</version>??
  74. ????</dependency>??
  75. ????<!--?用于對@ResponseBody注解的支持?-->??
  76. ????<dependency>??
  77. ????????<groupId>org.codehaus.jackson</groupId>??
  78. ????????<artifactId>jackson-mapper-asl</artifactId>??
  79. ????????<version>1.9.13</version>??
  80. ????</dependency>??????????
  81. ????<!--?提供對c標簽的支持?-->??
  82. ????<dependency>??
  83. ????????<groupId>javax.servlet</groupId>??
  84. ????????<artifactId>jstl</artifactId>??
  85. ????????<version>1.2</version>??
  86. ????</dependency>??
  87. ????<!--?servlet?api?-->??
  88. ????<dependency>??
  89. ??????<groupId>javax.servlet</groupId>??
  90. ??????<artifactId>servlet-api</artifactId>??
  91. ??????<version>2.5</version>??
  92. ????</dependency>??
  93. ??????
  94. ????<!--Apache?Shiro所需的jar包-->????
  95. ????<dependency>????
  96. ??????<groupId>org.apache.shiro</groupId>????
  97. ??????<artifactId>shiro-core</artifactId>????
  98. ??????<version>1.2.2</version>????
  99. ????</dependency>????
  100. ????<dependency>????
  101. ??????<groupId>org.apache.shiro</groupId>????
  102. ??????<artifactId>shiro-web</artifactId>????
  103. ??????<version>1.2.2</version>????
  104. ????</dependency>????
  105. ????<dependency>????
  106. ??????<groupId>org.apache.shiro</groupId>????
  107. ??????<artifactId>shiro-spring</artifactId>????
  108. ??????<version>1.2.2</version>????
  109. ????</dependency>???
  110. ??</dependencies>??
  111. ????
  112. ??<build>??
  113. ????<finalName>springmvc</finalName>??
  114. ????<!--?maven的jetty服務器插件?-->??
  115. ????<plugins>??
  116. ????????<plugin>??
  117. ??????????<groupId>org.mortbay.jetty</groupId>??
  118. ??????????<artifactId>jetty-maven-plugin</artifactId>??
  119. ??????????<configuration>??
  120. ????????????<scanIntervalSeconds>10</scanIntervalSeconds>??
  121. ????????????<webApp>??
  122. ??????????????<contextPath>/</contextPath>??
  123. ????????????</webApp>??
  124. ????????????<!--?修改jetty的默認端口?-->??
  125. ????????????<connectors>??
  126. ???????????????<connector?implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">??
  127. ??????????????????<port>80</port>??
  128. ??????????????????<maxIdleTime>60000</maxIdleTime>??
  129. ???????????????</connector>??
  130. ????????????</connectors>??
  131. ??????????</configuration>??
  132. ????????</plugin>??
  133. ????</plugins>??
  134. ??</build>??
  135. </project>??

?

?web.xml中的配置:

Xml代碼??
  1. <?xml?version="1.0"?encoding="UTF-8"??>??
  2. <web-app?version="2.5"???
  3. ????xmlns="http://java.sun.com/xml/ns/javaee"???
  4. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  5. ????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  6. ????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  7. ??<display-name>Archetype?Created?Web?Application</display-name>??
  8. ????
  9. ??<!--?spring-orm-hibernate4的OpenSessionInViewFilter?-->??
  10. ??<filter>??
  11. ????<filter-name>opensessioninview</filter-name>??
  12. ????<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>??
  13. ??</filter>??
  14. ??<filter-mapping>??
  15. ????<filter-name>opensessioninview</filter-name>??
  16. ????<url-pattern>/*</url-pattern>??
  17. ??</filter-mapping>??
  18. ????
  19. ??<!--?配置springmvc?servlet?-->??
  20. ??<servlet>??
  21. ????<servlet-name>springmvc</servlet-name>??
  22. ????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
  23. ????<load-on-startup>1</load-on-startup>??
  24. ??</servlet>??
  25. ??<servlet-mapping>??
  26. ????<servlet-name>springmvc</servlet-name>??
  27. ????<!--?/?表示所有的請求都要經過此serlvet?-->??
  28. ????<url-pattern>/</url-pattern>??
  29. ??</servlet-mapping>??
  30. ????
  31. ??<!--?spring的監聽器?-->??
  32. ??<context-param>??
  33. ????<param-name>contextConfigLocation</param-name>??
  34. ????<param-value>classpath:applicationContext*.xml</param-value>??
  35. ??</context-param>??
  36. ??<listener>??
  37. ????<listener-class>??
  38. ????????org.springframework.web.context.ContextLoaderListener??
  39. ????</listener-class>??
  40. ??</listener>??
  41. ????
  42. ??<!--?Shiro配置?-->????
  43. ??<filter>????
  44. ????<filter-name>shiroFilter</filter-name>????
  45. ????<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>????
  46. ??</filter>????
  47. ??<filter-mapping>????
  48. ????<filter-name>shiroFilter</filter-name>????
  49. ????<url-pattern>/*</url-pattern>????
  50. ??</filter-mapping>??
  51. ????
  52. </web-app>??

?

?

Java代碼??
  1. package?com.cn.service;??
  2. ??
  3. import?java.util.List;??
  4. ??
  5. import?javax.inject.Inject;??
  6. ??
  7. import?org.apache.shiro.authc.AuthenticationException;??
  8. import?org.apache.shiro.authc.AuthenticationInfo;??
  9. import?org.apache.shiro.authc.AuthenticationToken;??
  10. import?org.apache.shiro.authc.SimpleAuthenticationInfo;??
  11. import?org.apache.shiro.authc.UsernamePasswordToken;??
  12. import?org.apache.shiro.authz.AuthorizationInfo;??
  13. import?org.apache.shiro.authz.SimpleAuthorizationInfo;??
  14. import?org.apache.shiro.realm.AuthorizingRealm;??
  15. import?org.apache.shiro.subject.PrincipalCollection;??
  16. import?org.springframework.stereotype.Service;??
  17. import?org.springframework.transaction.annotation.Transactional;??
  18. ??
  19. import?com.cn.pojo.Role;??
  20. import?com.cn.pojo.User;??
  21. ??
  22. @Service??
  23. @Transactional??
  24. public?class?MyShiro?extends?AuthorizingRealm{??
  25. ??
  26. ????@Inject??
  27. ????private?UserService?userService;??
  28. ????/**?
  29. ?????*?權限認證?
  30. ?????*/??
  31. ????@Override??
  32. ????protected?AuthorizationInfo?doGetAuthorizationInfo(PrincipalCollection?principalCollection)?{??
  33. ????????//獲取登錄時輸入的用戶名??
  34. ????????String?loginName=(String)?principalCollection.fromRealm(getName()).iterator().next();??
  35. ????????//到數據庫查是否有此對象??
  36. ????????User?user=userService.findByName(loginName);??
  37. ????????if(user!=null){??
  38. ????????????//權限信息對象info,用來存放查出的用戶的所有的角色(role)及權限(permission)??
  39. ????????????SimpleAuthorizationInfo?info=new?SimpleAuthorizationInfo();??
  40. ????????????//用戶的角色集合??
  41. ????????????info.setRoles(user.getRolesName());??
  42. ????????????//用戶的角色對應的所有權限,如果只使用角色定義訪問權限,下面的四行可以不要??
  43. ????????????List<Role>?roleList=user.getRoleList();??
  44. ????????????for?(Role?role?:?roleList)?{??
  45. ????????????????info.addStringPermissions(role.getPermissionsName());??
  46. ????????????}??
  47. ????????????return?info;??
  48. ????????}??
  49. ????????return?null;??
  50. ????}??
  51. ??
  52. ????/**?
  53. ?????*?登錄認證;?
  54. ?????*/??
  55. ????@Override??
  56. ????protected?AuthenticationInfo?doGetAuthenticationInfo(??
  57. ????????????AuthenticationToken?authenticationToken)?throws?AuthenticationException?{??
  58. ????????//UsernamePasswordToken對象用來存放提交的登錄信息??
  59. ????????UsernamePasswordToken?token=(UsernamePasswordToken)?authenticationToken;??
  60. ????????//查出是否有此用戶??
  61. ????????User?user=userService.findByName(token.getUsername());??
  62. ????????if(user!=null){??
  63. ????????????//若存在,將此用戶存放到登錄認證info中??
  64. ????????????return?new?SimpleAuthenticationInfo(user.getUsername(),?user.getPassword(),?getName());??
  65. ????????}??
  66. ????????return?null;??
  67. ????}??
  68. ??
  69. }??

?

?在spring的配置文件中配置,為了區別spring原配置和shiro我們將shiro的配置獨立出來。

applicationContext-shiro.xml

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:aop="http://www.springframework.org/schema/aop"??
  5. ???????xmlns:tx="http://www.springframework.org/schema/tx"??
  6. ???????xmlns:context="http://www.springframework.org/schema/context"??
  7. ???????xsi:schemaLocation="??
  8. http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd??
  9. http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx.xsd??
  10. http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop.xsd??
  11. http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context.xsd">??
  12. ??
  13. ????<!--?配置權限管理器?-->??
  14. ????<bean?id="securityManager"?class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">????
  15. ????????<!--?ref對應我們寫的realm??MyShiro?-->??
  16. ????????<property?name="realm"?ref="myShiro"/>????
  17. ????????<!--?使用下面配置的緩存管理器?-->??
  18. ????????<property?name="cacheManager"?ref="cacheManager"/>????
  19. ????</bean>??
  20. ??????
  21. ????<!--?配置shiro的過濾器工廠類,id-?shiroFilter要和我們在web.xml中配置的過濾器一致?-->??
  22. ????<bean?id="shiroFilter"?class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">???
  23. ????????<!--?調用我們配置的權限管理器?-->???
  24. ????????<property?name="securityManager"?ref="securityManager"/>???
  25. ????????<!--?配置我們的登錄請求地址?-->???
  26. ????????<property?name="loginUrl"?value="/login"/>????
  27. ????????<!--?配置我們在登錄頁登錄成功后的跳轉地址,如果你訪問的是非/login地址,則跳到您訪問的地址?-->??
  28. ????????<property?name="successUrl"?value="/user"/>????
  29. ????????<!--?如果您請求的資源不再您的權限范圍,則跳轉到/403請求地址?-->??
  30. ????????<property?name="unauthorizedUrl"?value="/403"/>????
  31. ????????<!--?權限配置?-->??
  32. ????????<property?name="filterChainDefinitions">????
  33. ????????????<value>????
  34. ????????????????<!--?anon表示此地址不需要任何權限即可訪問?-->??
  35. ????????????????/static/**=anon??
  36. ????????????????<!--?perms[user:query]表示訪問此連接需要權限為user:query的用戶?-->??
  37. ????????????????/user=perms[user:query]??
  38. ????????????????<!--?roles[manager]表示訪問此連接需要用戶的角色為manager?-->??
  39. ????????????????/user/add=roles[manager]??
  40. ????????????????/user/del/**=roles[admin]??
  41. ????????????????/user/edit/**=roles[manager]??
  42. ????????????????<!--所有的請求(除去配置的靜態資源請求或請求地址為anon的請求)都要通過登錄驗證,如果未登錄則跳到/login-->????
  43. ????????????????/**?=?authc??
  44. ????????????</value>????
  45. ????????</property>????
  46. ????</bean>??
  47. ??????
  48. ??????
  49. ????<bean?id="cacheManager"?class="org.apache.shiro.cache.MemoryConstrainedCacheManager"?/>????
  50. ????<bean?id="lifecycleBeanPostProcessor"?class="org.apache.shiro.spring.LifecycleBeanPostProcessor"?/>???
  51. ??????
  52. </beans>??

?

?用于登錄,登出,權限跳轉的控制:

Java代碼??
  1. package?com.cn.controller;??
  2. ??
  3. import?javax.validation.Valid;??
  4. ??
  5. import?org.apache.shiro.SecurityUtils;??
  6. import?org.apache.shiro.authc.AuthenticationException;??
  7. import?org.apache.shiro.authc.UsernamePasswordToken;??
  8. import?org.springframework.stereotype.Controller;??
  9. import?org.springframework.ui.Model;??
  10. import?org.springframework.validation.BindingResult;??
  11. import?org.springframework.web.bind.annotation.RequestMapping;??
  12. import?org.springframework.web.bind.annotation.RequestMethod;??
  13. import?org.springframework.web.servlet.mvc.support.RedirectAttributes;??
  14. ??
  15. import?com.cn.pojo.User;??
  16. ??
  17. @Controller??
  18. public?class?HomeController?{??
  19. ??
  20. ????@RequestMapping(value="/login",method=RequestMethod.GET)??
  21. ????public?String?loginForm(Model?model){??
  22. ????????model.addAttribute("user",?new?User());??
  23. ????????return?"/login";??
  24. ????}??
  25. ??????
  26. ????@RequestMapping(value="/login",method=RequestMethod.POST)??
  27. ????public?String?login(@Valid?User?user,BindingResult?bindingResult,RedirectAttributes?redirectAttributes){??
  28. ????????try?{??
  29. ????????????if(bindingResult.hasErrors()){??
  30. ????????????????return?"/login";??
  31. ????????????}??
  32. ????????????//使用權限工具進行用戶登錄,登錄成功后跳到shiro配置的successUrl中,與下面的return沒什么關系!??
  33. ????????????SecurityUtils.getSubject().login(new?UsernamePasswordToken(user.getUsername(),?user.getPassword()));??
  34. ????????????return?"redirect:/user";??
  35. ????????}?catch?(AuthenticationException?e)?{??
  36. ????????????redirectAttributes.addFlashAttribute("message","用戶名或密碼錯誤");??
  37. ????????????return?"redirect:/login";??
  38. ????????}??
  39. ????}??
  40. ??????
  41. ????@RequestMapping(value="/logout",method=RequestMethod.GET)????
  42. ????public?String?logout(RedirectAttributes?redirectAttributes?){???
  43. ????????//使用權限管理工具進行用戶的退出,跳出登錄,給出提示信息??
  44. ????????SecurityUtils.getSubject().logout();????
  45. ????????redirectAttributes.addFlashAttribute("message",?"您已安全退出");????
  46. ????????return?"redirect:/login";??
  47. ????}???
  48. ??????
  49. ????@RequestMapping("/403")??
  50. ????public?String?unauthorizedRole(){??
  51. ????????return?"/403";??
  52. ????}??
  53. }??

?

?三個主要的JSP:
login.jsp:

Html代碼??
  1. <%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
  2. <%@?taglib?prefix="form"?uri="http://www.springframework.org/tags/form"?%>??
  3. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
  4. <html>??
  5. ??<head>??
  6. ????<title>My?JSP?'MyJsp.jsp'?starting?page</title>??
  7. ??</head>??
  8. ????
  9. ??<body>??
  10. ????<h1>登錄頁面----${message?}</h1>??
  11. ????<img?alt=""?src="/static/img/1.jpg">??
  12. ????<form:form?action="/login"?commandName="user"?method="post">??
  13. ????????用戶名:<form:input?path="username"/>?<form:errors?path="username"?cssClass="error"/>?<br/>??
  14. ????????密?&nbsp;&nbsp;碼:<form:password?path="password"/>?<form:errors?path="password"?cssClass="error"?/>?<br/>??
  15. ????????<form:button?name="button">submit</form:button>??
  16. ????</form:form>??
  17. ??</body>??
  18. </html>??

?

?user.jsp:

Html代碼??
  1. <%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
  2. <%@?taglib?prefix="c"?uri="http://java.sun.com/jsp/jstl/core"?%>??
  3. <%@?taglib?prefix="shiro"?uri="http://shiro.apache.org/tags"?%>??
  4. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
  5. <html>??
  6. ??<head>??
  7. ????<title>用戶列表</title>??
  8. ??</head>??
  9. ??<body>??
  10. ????<h1>${message?}</h1>??
  11. ????<h1>用戶列表--<a?href="/user/add">添加用戶</a>---<a?href="/logout">退出登錄</a>????</h1>?
  12. ????<h2>權限列表</h2>??
  13. ????<shiro:authenticated>用戶已經登錄顯示此內容</shiro:authenticated>??
  14. ????<shiro:hasRole?name="manager">manager角色登錄顯示此內容</shiro:hasRole>??
  15. ????<shiro:hasRole?name="admin">admin角色登錄顯示此內容</shiro:hasRole>??
  16. ????<shiro:hasRole?name="normal">normal角色登錄顯示此內容</shiro:hasRole>??
  17. ??????
  18. ????<shiro:hasAnyRoles?name="manager,admin">**manager?or?admin?角色用戶登錄顯示此內容**</shiro:hasAnyRoles>??
  19. ????<shiro:principal/>-顯示當前登錄用戶名??
  20. ????<shiro:hasPermission?name="add">add權限用戶顯示此內容</shiro:hasPermission>??
  21. ????<shiro:hasPermission?name="user:query">query權限用戶顯示此內容<shiro:principal/></shiro:hasPermission>??
  22. ????<shiro:lacksPermission?name="user:del">?不具有user:del權限的用戶顯示此內容?</shiro:lacksPermission>??
  23. ????<ul>??
  24. ????????<c:forEach?items="${userList?}"?var="user">??
  25. ????????????<li>用戶名:${user.username?}----密碼:${user.password?}----<a?href="/user/edit/${user.id}">修改用戶</a>----<a?href="javascript:;"?class="del"?ref="${user.id?}">刪除用戶</a></li>??
  26. ????????</c:forEach>??
  27. ????</ul>??
  28. ????<img?alt=""?src="/static/img/1.jpg">??
  29. ????<script?type="text/javascript"?src="http://cdn.staticfile.org/jquery/1.9.1/jquery.min.js"></script>??
  30. ????<script>??
  31. ????????$(function(){??
  32. ????????????$(".del").click(function(){??
  33. ????????????????var?id=$(this).attr("ref");??
  34. ????????????????$.ajax({??
  35. ????????????????????type:"delete",??
  36. ????????????????????url:"/user/del/"+id,??
  37. ????????????????????success:function(e){??
  38. ??????????????????????????
  39. ????????????????????}??
  40. ????????????????});??
  41. ????????????});??
  42. ????????});??
  43. ????</script>??
  44. ??</body>??
  45. </html>??

?

?

?403.jsp:

Html代碼??
    1. <%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
    2. <%@?taglib?prefix="form"?uri="http://www.springframework.org/tags/form"?%>??
    3. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
    4. <html>??
    5. ??<head>??
    6. ????<title>權限錯誤</title>??
    7. ??</head>??
    8. ????
    9. ??<body>??
    10. ????<h1>對不起,您沒有權限請求此連接!</h1>??
    11. ????<img?alt=""?src="/static/img/1.jpg">??
    12. ??????
    13. ??</body>?

轉載于:https://www.cnblogs.com/shsgl/p/5339778.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458116.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Caffe源碼解析1:Blob

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 轉載請注明出處&#xff0c;樓燚(y)航的blog&#xff0c;http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob這個類&#xff0c;Blob是作為Caffe中數據流通的一個基本類&#xff0c;網絡…

學后感

今天上了構建之法&#xff0c;我加深了對軟件工程的了解&#xff0c;也明白了單元測試和回歸測試對軟件開發的重要性&#xff0c;然而在軟件開發的過程中&#xff0c; 一個團隊是需要一定的流程來管理開發活動&#xff0c;每個工程師在軟件生命周期所做的工作也應該有一個流程&…

Caffe源碼解析2:SycedMem

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html 轉載請注明出處&#xff0c;樓燚(y)航的blog&#xff0c;http://www.cnblogs.com/louyihang loves baiyan/ 看到SyncedMem就知道&#xff0c;這是在做內存同步的操作。這類個類的代碼比較少&#xff0c;…

REST學習

RPC架構與REST架構 RPC&#xff1a;RPC將服務器看作一些列動作的集合(需要做某件事) REST&#xff1a;將服務器看作分布式對象集合&#xff0c;客戶端通過調用這些對象上的方法來執行特定的任務&#xff0c;組件交互的可伸縮性、接口的通用性、組件的獨立部署、以及用來減少交互…

HI3559A和AI深度學習框架caffe

from:http://blog.sina.com.cn/s/blog_156e567660102ygdf.html 1、HI3559A支持深度學習框架caffe。其中的NNIE神經網絡加速單元是主要的屬性。 2、caffe是一種快速深度學習框架和TensorFlow一樣是一組標準深度學習開源框架。 3、對應想嘗試AI深度學習的朋友可以按照網上的流…

UValive4195 Heroes of Money and Magic

斜率優化 想罵人了&#xff0c;馬格吉最后調了半小時 TMD造數據的人是SB吧&#xff1f; 我寫 while(scanf("%d%d",&n,&m)!EOF&&n) 然后就TMD無限WA...WA...WA... 尼瑪 改成while(scanf("%d%d",&n,&m),n) 就過了&#xff0c;就過了…

Google Protocol Buffer 的使用和原理

from: https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 簡介 什么是 Google Protocol Buffer&#xff1f; 假如您在網上搜索&#xff0c;應該會得到類似這樣的文字介紹&#xff1a; Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言…

Electron

跨平臺桌面app開發 Appjs hex nwjs electron 官網&#xff1a;http://electron.atom.io/ 中文文檔&#xff1a;https://github.com/atom/electron/tree/master/docs-translations/zh-CN zcbenz&#xff1a; https://github.com/zcbenz https://github.com/atom/electron simple…

WCF技術剖析之十八:消息契約(Message Contract)和基于消息契約的序列化

在本篇文章中&#xff0c;我們將討論WCF四大契約&#xff08;服務契約、數據契約、消息契約和錯誤契約&#xff09;之一的消息契約&#xff08;Message Contract&#xff09;。服務契約關注于對服務操作的描述&#xff0c;數據契約關注于對于數據結構和格式的描述&#xff0c;而…

【深度學習數據集】常用公開圖片數據集下載

1.MNIST MNIST是一個手寫數字數據庫&#xff0c;它有60000個訓練樣本集和10000個測試樣本集&#xff0c;每個樣本圖像的寬高為28*28。此數據集是以二進制存儲的&#xff0c;不能直接以圖像格式查看&#xff0c;不過很容易找到將其轉換成圖像格式的工具。 最早的深度卷積網絡Le…

常用的幾種卷積神經網絡介紹

常用的幾種卷積神經網絡介紹 標簽&#xff08;空格分隔&#xff09;&#xff1a; 深度學習 這是一篇基礎理論的博客&#xff0c;基本手法是抄、刪、改、查&#xff0c;畢竟介紹這幾個基礎網絡的博文也挺多的&#xff0c;就算是自己的一個筆記吧&#xff0c;以后忘了多看看。主…

計算客 (人人都有極客精神)爆力

人人公司是一家極為鼓舞極客精神的公司&#xff0c;當有重要的項目須要上線但又時間太緊。甚至須要當天上線的時候。往往會掛起海盜旗開啟電子日期顯示。讓大家能夠在對時間有更明白的感知的情況下&#xff0c;同心協力搞定重要的項目。海盜旗下方的電子屏顯示的日期形式為 YYY…

深度學習案例

1. neural-style&#xff1a;利用卷積神經網絡將一幅圖像的內容與另一幅圖像的風格相結合 https://github.com/jcjohnson/neural-style 2.Nerual Doodles&#xff1a;把 2 位的 Doodle 轉成精良的藝術品 https://github.com/alexjc/neural-doodle 3. srez&#xff1a;通過深度…

深度學習圖像標注工具匯總

對于監督學習算法而言&#xff0c;數據決定了任務的上限&#xff0c;而算法只是在不斷逼近這個上限。世界上最遙遠的距離就是我們用同一個模型&#xff0c;但是卻有不同的任務。但是數據標注是個耗時耗力的工作&#xff0c;下面介紹幾個圖像標注工具&#xff1a; Labelme Labe…

UIBarbuttonItem

APPDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; //創建主界面&#xff0c;導航欄的第一個頁面 FirstViewContr…

深度殘差網絡ResNet解析

ResNet在2015年被提出&#xff0c;在ImageNet比賽classification任務上獲得第一名&#xff0c;因為它“簡單與實用”并存&#xff0c;之后很多方法都建立在ResNet50或者ResNet101的基礎上完成的&#xff0c;檢測&#xff0c;分割&#xff0c;識別等領域都紛紛使用ResNet&#x…

Oracle-一個中文漢字占幾個字節?

Oracle 一個中文漢字占用幾個字節 Oracle 一個中文漢字 占用幾個字節&#xff0c;要根據Oracle中字符集編碼決定!!! 1. 如果定義為VARCHAR2(32 CHAR),那么該列最多就可以存儲32個漢字&#xff0c;如果定義字段為VARCHAR2&#xff08;32&#xff09; 或VARCHAR2&#xff08;32 B…

基于深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN

object detection我的理解&#xff0c;就是在給定的圖片中精確找到物體所在位置&#xff0c;并標注出物體的類別。object detection要解決的問題就是物體在哪里&#xff0c;是什么這整個流程的問題。然而&#xff0c;這個問題可不是那么容易解決的&#xff0c;物體的尺寸變化范…

iPhone屏幕尺寸/launch尺寸/icon尺寸

屏幕尺寸 6p/6sp 414 X 7366/6s 375 X 6675/5s 320 X 568 4/4s 320 X 480launch尺寸 6p/6sp 1242 X 2208 3x6/6s 750 X 1334 2x5/5s 640 X 1136 2x4/4s 640 X 960 2x仔細觀察會發現l…

CNN的發展歷史(LeNet,Alexnet,VGGNet,GoogleNet,ReSNet)

歡迎轉載&#xff0c;轉載請注明&#xff1a;本文出自Bin的專欄blog.csdn.net/xbinworld。 關于卷積神經網絡CNN&#xff0c;網絡和文獻中有非常多的資料&#xff0c;我在工作/研究中也用了好一段時間各種常見的model了&#xff0c;就想著簡單整理一下&#xff0c;以備查閱之需…