本篇博客主要讲述的是两者的集成。不涉及到各自的详细细节和功能。

因为官方给出的文档不够具体,对新手而言通过官方文档还不可以非常快的搭建出SpringShiro的webproject。本博客将通过实际的案例提供具体的教程。

案例分析:

项目名称:假期系统

组织机构:部门 > 小组

角色:Admin, SeniorManager,TeamLeader,Developer

资源:假期Leave

权限:申请Apply,审核Review, 复核ReReview。查看View

角色级别:Admin > Senior Manager >Team Leader > Developer

角色权限:

 

Admin

Senior Manager

Team Leader

Developer

Apply

Y

Y

Y

Y

Review

Y

Y

Y

N

ReReview

Y

Y

N

N

View

Y

Y

Y

Y

特殊需求:

1. 角色能够绑定到不同的组织机构级别,比方SeniorManager 是基于部门的,TeamLeader则是基于小组的

2. 角色的级别关系仅仅能在同样的部门中,不同部门之间的角色没有关联

3. 审核仅仅能是自己上级角色审核,复核必须是审核者的上级角色复核,即Developer提出的请假申请仅仅能TeamLeader来审核,而且由SeniorManager复核。

数据库设计

最简单的数据库设计例如以下:

表名

列名

描写叙述

类型

t_dept

部门表

id

部门编号

Int

name

部门名称

Varchar

 

t_team

小组表

id

小组编号

Int

name

小组名称

Varchar

 

t_user

用户表

id

用户编号

Int

username

username称

Varchar

password

用户加密password

Varchar

salt

用户加密盐

Varchar

manager_id

用户上级领导id

Int

 

t_role

角色表

id

角色编号

Int

name

角色名称

Varchar

dept_flag

角色是否关联部门

Bool

team_flag

角色是否关联小组

Bool

 

t_user_role

用户所属角色表

Id

用户角色编号

Int

user_id

用户编号

Int

dept_id

部门编号

Int

team_id

小组编号

Int

role_id

角色编号

Int

 

t_resource

资源表

id

资源编号

Int

name

资源名称

Varchar

 

t_permission

权限表

id

权限编号

Int

name

权限名称

Varchar

 

t_role_resource_permission

角色拥有的资源权限表

id

编号

Int

role_id

角色编号

Int

resource_id

资源编号

Int

permission_id

权限编号

Int

 

 

 

 

t_leave

请假申请表

id

请假申请编号

Int

user_id

请假者编号

Int

days

请假时长

Int

fromDate

開始日期

Date

toDate

结束日期

Date

remark

请假说明

Varchar

flag

请假状态

Int

apply_date

申请的时间

Datetime

review_user_id

审核人编号

Int

review_date

审核日期

Date

review_remark

审核说明

Varchar

rereview_user_id

复核人编号

Int

rereview_date

复核日期

Date

rereview_remark

复核说明

Varchar

加入測试数据:

项目搭建

Maven Project: pom.xml

新建一个maven项目,packaging设定为war,设定Spring和Shiro的版本号为3.1.4.RELEASE和1.2.3。并加入必要的依赖。

详细例如以下:

  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>com.xx.shiro</groupId>
  5. <artifactId>demo</artifactId>
  6. <version>1.0.0</version>
  7. <packaging>war</packaging>
  8.  
  9. <properties>
  10. <java-version>1.7</java-version>
  11. <org.springframework-version>3.1.4.RELEASE</org.springframework-version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <org.shiro-version>1.2.3</org.shiro-version>
  14. </properties>
  15.  
  16. <dependencies>
  17. <!-- Java EE 6 API java enterprise edition -->
  18. <dependency>
  19. <groupId>javax</groupId>
  20. <artifactId>javaee-api</artifactId>
  21. <version>6.0</version>
  22. <scope>provided</scope>
  23. </dependency>
  24.  
  25. <!-- spring-context [annotation...] -->
  26. <dependency>
  27. <groupId>org.springframework</groupId>
  28. <artifactId>spring-context</artifactId>
  29. <version>${org.springframework-version}</version>
  30. <exclusions>
  31. <!-- Exclude Commons Logging in favor of SLF4j -->
  32. <exclusion>
  33. <groupId>commons-logging</groupId>
  34. <artifactId>commons-logging</artifactId>
  35. </exclusion>
  36. </exclusions>
  37. </dependency>
  38.  
  39. <!-- spring modules start -->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-webmvc</artifactId>
  43. <version>${org.springframework-version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-core</artifactId>
  48. <version>${org.springframework-version}</version>
  49. </dependency>
  50.  
  51. <dependency>
  52. <groupId>org.springframework</groupId>
  53. <artifactId>spring-jdbc</artifactId>
  54. <version>${org.springframework-version}</version>
  55. </dependency>
  56.  
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-aop</artifactId>
  60. <version>${org.springframework-version}</version>
  61. </dependency>
  62.  
  63. <dependency>
  64. <groupId>org.springframework</groupId>
  65. <artifactId>spring-tx</artifactId>
  66. <version>${org.springframework-version}</version>
  67. </dependency>
  68.  
  69. <!-- apache shiro start -->
  70. <dependency>
  71. <groupId>org.apache.shiro</groupId>
  72. <artifactId>shiro-core</artifactId>
  73. <version>${org.shiro-version}</version>
  74. </dependency>
  75. <dependency>
  76. <groupId>org.apache.shiro</groupId>
  77. <artifactId>shiro-ehcache</artifactId>
  78. <version>${org.shiro-version}</version>
  79. </dependency>
  80. <dependency>
  81. <groupId>org.apache.shiro</groupId>
  82. <artifactId>shiro-web</artifactId>
  83. <version>${org.shiro-version}</version>
  84. </dependency>
  85. <dependency>
  86. <groupId>org.apache.shiro</groupId>
  87. <artifactId>shiro-quartz</artifactId>
  88. <version>${org.shiro-version}</version>
  89. </dependency>
  90. <dependency>
  91. <groupId>org.apache.shiro</groupId>
  92. <artifactId>shiro-spring</artifactId>
  93. <version>${org.shiro-version}</version>
  94. </dependency>
  95. <!-- apache shiro end -->
  96.  
  97. <!-- jackson -->
  98. <dependency>
  99. <groupId>org.codehaus.jackson</groupId>
  100. <artifactId>jackson-core-asl</artifactId>
  101. <version>1.8.8</version>
  102. </dependency>
  103. <dependency>
  104. <groupId>org.codehaus.jackson</groupId>
  105. <artifactId>jackson-mapper-asl</artifactId>
  106. <version>1.8.8</version>
  107. </dependency>
  108.  
  109. <!-- java.lang.* Extension -->
  110. <dependency>
  111. <groupId>commons-lang</groupId>
  112. <artifactId>commons-lang</artifactId>
  113. <version>2.6</version>
  114. </dependency>
  115.  
  116. <!-- java.io.InputStream and Reader Extension -->
  117. <dependency>
  118. <groupId>commons-io</groupId>
  119. <artifactId>commons-io</artifactId>
  120. <version>2.4</version>
  121. </dependency>
  122.  
  123. <!-- JavaServer Pages Standard Tag Library -->
  124. <dependency>
  125. <groupId>jstl</groupId>
  126. <artifactId>jstl</artifactId>
  127. <version>1.2</version>
  128. </dependency>
  129.  
  130. <!-- slf4j -->
  131. <dependency>
  132. <groupId>org.slf4j</groupId>
  133. <artifactId>slf4j-api</artifactId>
  134. <version>1.6.6</version>
  135. </dependency>
  136. <dependency>
  137. <groupId>org.slf4j</groupId>
  138. <artifactId>slf4j-log4j12</artifactId>
  139. <version>1.6.6</version>
  140. </dependency>
  141.  
  142. <!-- log4j -->
  143. <dependency>
  144. <groupId>log4j</groupId>
  145. <artifactId>log4j</artifactId>
  146. <version>1.2.15</version>
  147. <exclusions>
  148. <exclusion>
  149. <groupId>com.sun.jmx</groupId>
  150. <artifactId>jmxri</artifactId>
  151. </exclusion>
  152. <exclusion>
  153. <groupId>com.sun.jdmk</groupId>
  154. <artifactId>jmxtools</artifactId>
  155. </exclusion>
  156. <exclusion>
  157. <groupId>javax.jms</groupId>
  158. <artifactId>jms</artifactId>
  159. </exclusion>
  160. </exclusions>
  161. </dependency>
  162.  
  163. <!-- encode -->
  164. <dependency>
  165. <groupId>commons-codec</groupId>
  166. <artifactId>commons-codec</artifactId>
  167. <version>1.6</version>
  168. </dependency>
  169. <dependency>
  170. <groupId>com.xx.rtpc.shared.utils</groupId>
  171. <artifactId>rtpc-crypt</artifactId>
  172. <version>3.1.0</version>
  173. </dependency>
  174.  
  175. <dependency>
  176. <groupId>c3p0</groupId>
  177. <artifactId>c3p0</artifactId>
  178. <version>0.9.1</version>
  179. </dependency>
  180.  
  181. <dependency>
  182. <groupId>mysql</groupId>
  183. <artifactId>mysql-connector-java</artifactId>
  184. <version>5.1.4</version>
  185. </dependency>
  186.  
  187. <dependency>
  188. <groupId>cglib</groupId>
  189. <artifactId>cglib</artifactId>
  190. <version>2.2</version>
  191. </dependency>
  192. </dependencies>
  193.  
  194. <build>
  195. <finalName>demo</finalName>
  196. </build>
  197. </project>

配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app
  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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6. version="3.0"
  7. metadata-complete="false">
  8.  
  9. <display-name>shiro-example</display-name>
  10.  
  11. <!-- Spring配置文件開始 -->
  12. <context-param>
  13. <param-name>contextConfigLocation</param-name>
  14. <param-value>
  15. /WEB-INF/dispatcher-servlet.xml
  16. </param-value>
  17. </context-param>
  18.  
  19. <!-- listener -->
  20. <listener>
  21. <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  22. </listener>
  23. <listener>
  24. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  25. </listener>
  26.  
  27. <!-- shiro 安全过滤器 -->
  28. <filter>
  29. <filter-name>shiroFilter</filter-name>
  30. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  31. <async-supported>true</async-supported>
  32. <init-param>
  33. <param-name>targetFilterLifecycle</param-name>
  34. <param-value>true</param-value>
  35. </init-param>
  36. </filter>
  37.  
  38. <filter-mapping>
  39. <filter-name>shiroFilter</filter-name>
  40. <url-pattern>/*</url-pattern>
  41. <dispatcher>REQUEST</dispatcher>
  42. </filter-mapping>
  43.  
  44. <servlet>
  45. <servlet-name>dispatcher</servlet-name>
  46. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  47. <load-on-startup>1</load-on-startup>
  48. </servlet>
  49. <servlet-mapping>
  50. <servlet-name>dispatcher</servlet-name>
  51. <url-pattern>*.spring</url-pattern>
  52. </servlet-mapping>
  53.  
  54. <welcome-file-list>
  55. <welcome-file>/home.spring</welcome-file>
  56. </welcome-file-list>
  57. </web-app>

Spring Configure: dispatcher-servlet.xml

在src/main/webapp/WEB-INF以下新建Spring的配置文件。命名为dispatcher-servlet.xml.详细设定例如以下:

  1. <?xml version="1.0" encoding="UTF-8"?
  2.  
  3. >
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  7. xmlns:mvc="http://www.springframework.org/schema/mvc"
  8. xsi:schemaLocation="
  9. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  13. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  14.  
  15. <mvc:resources location="/resources/" mapping="/resources/**" />
  16.  
  17. <context:component-scan base-package="com.xx.shiro.demo"></context:component-scan>
  18.  
  19. <mvc:annotation-driven>
  20. <mvc:message-converters>
  21. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  22. <property name="supportedMediaTypes">
  23. <list>
  24. <value>text/html;charset=UTF-8</value>
  25. <value>text/plain;charset=UTF-8</value>
  26. </list>
  27. </property>
  28. </bean>
  29. <bean id="jsonHttpMessageConverter"
  30. class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
  31. <property name="supportedMediaTypes">
  32. <list>
  33. <value>application/json</value>
  34. <value>text/json</value>
  35. </list>
  36. </property>
  37. </bean>
  38. </mvc:message-converters>
  39. </mvc:annotation-driven>
  40.  
  41. <!-- 凭证匹配器 -->
  42. <bean id="credentialsMatcher" class="com.xx.shiro.demo.credentials.DemoCredentialsMatcher">
  43. <property name="retry" value="3"/>
  44. <property name="hashAlgorithmName" value="md5"/>
  45. <property name="hashIterations" value="2"/>
  46. <property name="storedCredentialsHexEncoded" value="true"/>
  47. </bean>
  48.  
  49. <!-- Realm实现 -->
  50. <bean id="xxDemoRealm" class="com.xx.shiro.demo.realm.XxDemoRealm">
  51. <property name="credentialsMatcher" ref="credentialsMatcher"/>
  52. <property name="userService" ref="userService" />
  53. </bean>
  54.  
  55. <!-- 安全管理器 -->
  56. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  57. <property name="realm" ref="xxDemoRealm" />
  58. </bean>
  59.  
  60. <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) -->
  61. <bean
  62. class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  63. <property name="staticMethod"
  64. value="org.apache.shiro.SecurityUtils.setSecurityManager" />
  65. <property name="arguments" ref="securityManager" />
  66. </bean>
  67.  
  68. <!-- ShiroWeb过滤器 -->
  69. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  70. <property name="securityManager" ref="securityManager" />
  71. <property name="loginUrl" value="/login.spring" />
  72. <property name="successUrl" value="/home.spring" />
  73. <property name="filterChainDefinitions">
  74. <value>
  75. /login.sping = anon
  76. /resources/** = anon
  77. /** = user
  78. </value>
  79. </property>
  80. </bean>
  81.  
  82. <!-- Shiro生命周期处理器 -->
  83. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
  84.  
  85. <!-- Enable shiro annotations -->
  86. <bean
  87. class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
  88. depends-on="lifecycleBeanPostProcessor" />
  89. <bean
  90. class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  91. <property name="securityManager" ref="securityManager" />
  92. </bean>
  93.  
  94. <!-- 数据库连接 -->
  95. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  96. <property name="dataSource" ref="dataSource" />
  97. </bean>
  98.  
  99. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  100. <property name="driverClass" value="com.mysql.jdbc.Driver" />
  101. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shiro" />
  102. <property name="user" value="root" />
  103. <property name="password" value="admin" />
  104. <property name="maxPoolSize" value="100" />
  105. <property name="minPoolSize" value="10" />
  106. <property name="initialPoolSize" value="10" />
  107. <property name="maxIdleTime" value="1800" />
  108. <property name="acquireIncrement" value="10" />
  109. <property name="idleConnectionTestPeriod" value="600" />
  110. <property name="acquireRetryAttempts" value="30" />
  111. <property name="breakAfterAcquireFailure" value="false" />
  112. <property name="preferredTestQuery" value="SELECT 1" />
  113. </bean>
  114.  
  115. <!-- User service and dao -->
  116. <bean id="userDao" class="com.xx.shiro.demo.dao.impl.UserDaoImpl">
  117. <property name="jdbcTemplate" ref="jdbcTemplate" />
  118. </bean>
  119.  
  120. <bean id="userService" class="com.xx.shiro.demo.service.impl.UserServiceImpl">
  121. <property name="userDao" ref="userDao" />
  122. </bean>
  123.  
  124. <bean
  125. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  126. <property name="prefix" value="/WEB-INF/pages/"></property>
  127. <property name="suffix" value=".jsp"></property>
  128. </bean>
  129. </beans>

从配置文件能够看出我们要实现两个重要的模块。一个是CredentialsMatcher, 另外一个叫做Realm。CredentialsMatcher是用来验证password的正确性,Realm则是来获取用户授权和认证的信息。

  1. <!-- 凭证匹配器 -->
  2. <bean id="credentialsMatcher" class="com.xx.shiro.demo.credentials.DemoCredentialsMatcher">
  3. <property name="retry" value="3"/>
  4. <property name="hashAlgorithmName" value="md5"/>
  5. <property name="hashIterations" value="2"/>
  6. <property name="storedCredentialsHexEncoded" value="true"/>
  7. </bean>
  8.  
  9. <!-- Realm实现 -->
  10. <bean id="xxDemoRealm" class="com.xx.shiro.demo.realm.XxDemoRealm">
  11. <property name="credentialsMatcher" ref="credentialsMatcher"/>
  12. <property name="userService" ref="userService" />
  13. </bean>

首先来看一下自己定义的Realm,

它继承了抽象类AuthorizingRealm,同一时候AuthorizingRealm又继承了抽象类AuthenticatingRealm,所以自己定义的Realm中要实现两个抽象方法。一个是获取认证信息。另外一个是获取授权信息。详细例如以下:

  1. public class XxDemoRealm extends AuthorizingRealm {
  2.  
  3. UserService userService;
  4. @Override
  5. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  6. if (principals == null) {
  7. throw new AuthorizationException("PrincipalCollection method argument cannot be null.");
  8. }
  9.  
  10. String username = (String)principals.getPrimaryPrincipal();
  11.  
  12. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  13. authorizationInfo.setRoles(userService.findRoles(username));
  14. authorizationInfo.setStringPermissions(userService.findPermissions(username));
  15. return authorizationInfo;
  16. }
  17. @Override
  18. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
  19. throws AuthenticationException {
  20. UsernamePasswordToken upToken = (UsernamePasswordToken) token;
  21. String username = upToken.getUsername();
  22.  
  23. if (username == null) {
  24. throw new AccountException("Null usernames are not allowed by this realm.");
  25. }
  26.  
  27. String[] pwdSalt = userService.getUserPasswordAndSalt(username);
  28. if (pwdSalt == null) {
  29. throw new AccountException("No account found for user [" + username + "]");
  30. }
  31.  
  32. return new SimpleAuthenticationInfo(username, pwdSalt[0].toCharArray(),
  33. ByteSource.Util.bytes(username + pwdSalt[1]), getName());
  34.  
  35. }
  36. public void setUserService(UserService userService) {
  37. this.userService = userService;
  38. }
  39. }

这里我们分别返回SimpleAuthenticationInfo和SimpleAuthorizationInfo。SimpleAuthenticationInfo是由username,登录password,password盐以及realm名称组成,而SimpleAuthorizationInfo继承与SimpleAuthenticationInfo。同一时候又包括了角色和权限的集合。

在spring的配置中我们定义自己定义realm的时候指定了凭证匹配器:

  1. <bean id="xxDemoRealm" class="com.xx.shiro.demo.realm.XxDemoRealm">
  2. <property name="credentialsMatcher" ref="credentialsMatcher"/>
  3. <property name="userService" ref="userService" />
  4. </bean>

凭证匹配器就是用来验证用户输入的帐号password和数据库中的password是否匹配。

  1. public class DemoCredentialsMatcher extends HashedCredentialsMatcher {
  2.  
  3. // 这里应该用cache来做, 不要用Map
  4. private static Map<String, AtomicInteger> cache = new HashMap<String, AtomicInteger>();
  5.  
  6. private int retry = 5;
  7.  
  8. @Override
  9. public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
  10. String username = (String) token.getPrincipal();
  11. AtomicInteger retryCount = cache.get(username);
  12. if (retryCount == null) {
  13. retryCount = new AtomicInteger(0);
  14. cache.put(username, retryCount);
  15. }
  16. if (retryCount.incrementAndGet() > retry) {
  17. throw new ExcessiveAttemptsException();
  18. }
  19. boolean matches = super.doCredentialsMatch(token, info);
  20. if (matches) {
  21. cache.remove(username);
  22. }
  23. return matches;
  24. }
  25.  
  26. public void setRetry(int retry) {
  27. this.retry = retry;
  28. }
  29.  
  30. }

我们这里使用的是HashedCredentialsMatcher,另外加入了重试最大次数的机制。失败几次之后就不能登录了,解锁这里没有涉及到。

官方文档地址:http://shiro.apache.org/spring.html

未完待续。。

。。。

Shiro集成Spring的更多相关文章

  1. shiro集成spring&工作流程&DelegatingFilterProxy

    1.集成Spring 参考文献: 新建web工程: ehcache-core来自Hibernate wen.xml <?xml version="1.0" encoding= ...

  2. shiro 集成spring 配置 学习记录(一)

    首先当然是项目中需要增加shiro的架包依赖: <!-- shiro --> <dependency> <groupId>org.apache.shiro</ ...

  3. shiro 集成spring 使用 redis作为缓存 学习记录(六)

    1.在applicationContext-redis.xml配置文件中增加如下: 申明一个cacheManager对象 用来注入到  shiro的   securityManager 属性  cac ...

  4. Shiro 集成Spring 使用 redis时 使用redisTemplate替代jedisPool(五)

    1.添加依赖架包: <dependency> <groupId>org.springframework.data</groupId> <artifactId& ...

  5. shiro学习(四、shiro集成spring+springmvc)

    依赖:spring-context,spring-MVC,shiro-core,shiro-spring,shiro-web 实话实说:web.xml,spring,springmvc配置文件好难 大 ...

  6. Apache Shiro 集成Spring(二)

    1.依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cor ...

  7. shiro与spring集成

    简介 Apache Shiro 是 Java 的一个安全(权限)框架.主要提供了认证.授权.加密和会话管理等功能. Authentication:身份认证/登录,验证用户是不是拥有相应的身份:Auth ...

  8. shiro:集成Spring(四)

    基于[加密及密码比对器(三)]项目改造 引入相关依赖环境 shiro-spring已经包含 shiro-core和shiro-web 所以这两个依赖可以删掉 <!--shiro继承spring依 ...

  9. cas+tomcat+shiro实现单点登录-4-Apache Shiro 集成Cas作为cas client端实现

    目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

随机推荐

  1. Python基础知识小结

    1. 关于函数传参 def func(n, *args, **kwargs): print n print args print kwargs if __name__ == '__main__': # ...

  2. Android设计 - 图标设计概述(Iconography)

    2014-10-30 张云飞VIR 翻译自:https://developer.android.com/design/style/iconography.html Iconography 图标设计概述 ...

  3. name是个特殊的变量名吗

    这是为什么?求大神

  4. ES06--elasticsearch

    ES06--elasticsearch unassigned错误解决(手动处理)   查看集群健康状态:curl -XGET http://localhost:9200/_cluster/health ...

  5. ubuntu14.04 3D桌面效果制作

    参考:http://www.360doc.com/content/14/0919/22/11681374_410808557.shtml

  6. FreeRDP的安装配置(错误信息:SSL_read: Failure in SSL library (protocol error?))

    最新文章:Virson's Blog 使用xfreerdp [serveripaddress]命令,连接xp/windows 2003都正常,但是在连接win7/2008时总是出错: ;------- ...

  7. ZARM in Linux & MIUI

    zram是Linux内核的一个模块,之前被称为“compcache”.zram通过在RAM内的压缩快设备上分页,直到必须使用硬盘上的交换空间,以避免在磁盘上进行分页,从而提高性能.由于zram可以用内 ...

  8. 远程操作与端口转发 SSH原理与运用

    SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作. 上一节的操作,就是一个例子: $ ssh user@host 'mkdir -p .ssh && cat >&g ...

  9. VIM下的普通模式的相关知识

    什么为一次操作? 从进行插入模式开始,直到返回普通模式为止,在此期间的任何修改都视为一次操作:   使用 u 可以撤销最新的修改: 所以呢,控制好在插入模式的操作就可以控制好撤销命令的粒度: 另外,最 ...

  10. Java如何获取正在运行的线程的Id?

    在Java编程中,如何获取正在运行的线程的Id? 以下示例演示如何使用getThreadId()方法获取正在运行的线程的Id. package com.yiibai; public class IdT ...