一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解spring與shiro集成

詳解spring與shiro集成

2021-01-09 14:54動力節點 Java教程

這篇文章主要介紹了詳解spring與shiro集成,需要的朋友可以參考下

Shiro的組件都是JavaBean/POJO式的組件,所以非常容易使用Spring進行組件管理,可以非常方便的從ini配置遷移到Spring進行管理,且支持JavaSE應用及Web應用的集成

在示例之前,需要導入shiro-spring及spring-context依賴,具體請參考pom.xml。

spring-beans.xml配置文件提供了基礎組件如DataSource、DAO、Service組件的配置。

JavaSE應用 

spring-shiro.xml提供了普通JavaSE獨立應用的Spring配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!-- 緩存管理器 使用Ehcache實現 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
  <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
</bean>
<!-- 憑證匹配器 -->
<bean id="credentialsMatcher" class="
com.github.zhangkaitao.shiro.chapter12.credentials.RetryLimitHashedCredentialsMatcher">
  <constructor-arg ref="cacheManager"/>
  <property name="hashAlgorithmName" value="md5"/>
  <property name="hashIterations" value="2"/>
  <property name="storedCredentialsHexEncoded" value="true"/>
</bean>
<!-- Realm實現 -->
<bean id="userRealm" class="com.github.zhangkaitao.shiro.chapter12.realm.UserRealm">
  <property name="userService" ref="userService"/>
  <property name="credentialsMatcher" ref="credentialsMatcher"/>
  <property name="cachingEnabled" value="true"/>
  <property name="authenticationCachingEnabled" value="true"/>
  <property name="authenticationCacheName" value="authenticationCache"/>
  <property name="authorizationCachingEnabled" value="true"/>
  <property name="authorizationCacheName" value="authorizationCache"/>
</bean>
<!-- 會話ID生成器 -->
<bean id="sessionIdGenerator"
class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
<!-- 會話DAO -->
<bean id="sessionDAO"
class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
  <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
  <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
<!-- 會話驗證調度器 -->
<bean id="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
  <property name="sessionValidationInterval" value="1800000"/>
  <property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 會話管理器 -->
<bean id="sessionManager" class="org.apache.shiro.session.mgt.DefaultSessionManager">
  <property name="globalSessionTimeout" value="1800000"/>
  <property name="deleteInvalidSessions" value="true"/>
  <property name="sessionValidationSchedulerEnabled" value="true"/>
  <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
  <property name="sessionDAO" ref="sessionDAO"/>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
  <property name="realms">
    <list><ref bean="userRealm"/></list>
  </property>
  <property name="sessionManager" ref="sessionManager"/>
  <property name="cacheManager" ref="cacheManager"/>
</bean>
<!-- 相當于調用SecurityUtils.setSecurityManager(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生命周期處理器-->
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

可以看出,只要把之前的ini配置翻譯為此處的spring xml配置方式即可,無須多解釋。LifecycleBeanPostProcessor用于在實現了Initializable接口的Shiro bean初始化時調用Initializable接口回調,在實現了Destroyable接口的Shiro bean銷毀時調用 Destroyable接口回調。如UserRealm就實現了Initializable,而DefaultSecurityManager實現了Destroyable。具體可以查看它們的繼承關系。  

測試用例請參考com.github.zhangkaitao.shiro.chapter12.ShiroTest。  

Web應用

Web應用和普通JavaSE應用的某些配置是類似的,此處只提供一些不一樣的配置,詳細配置可以參考spring-shiro-web.xml。  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 會話Cookie模板 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
  <constructor-arg value="sid"/>
  <property name="httpOnly" value="true"/>
  <property name="maxAge" value="180000"/>
</bean>
<!-- 會話管理器 -->
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  <property name="globalSessionTimeout" value="1800000"/>
  <property name="deleteInvalidSessions" value="true"/>
  <property name="sessionValidationSchedulerEnabled" value="true"/>
  <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
  <property name="sessionDAO" ref="sessionDAO"/>
  <property name="sessionIdCookieEnabled" value="true"/>
  <property name="sessionIdCookie" ref="sessionIdCookie"/>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
  <property name="sessionManager" ref="sessionManager"/>
  <property name="cacheManager" ref="cacheManager"/>
</bean>

1、sessionIdCookie是用于生產Session ID Cookie的模板;

2、會話管理器使用用于web環境的DefaultWebSessionManager;

3、安全管理器使用用于web環境的DefaultWebSecurityManager。  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- 基于Form表單的身份驗證過濾器 -->
<bean id="formAuthenticationFilter"
class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
  <property name="usernameParam" value="username"/>
  <property name="passwordParam" value="password"/>
  <property name="loginUrl" value="/login.jsp"/>
</bean>
<!-- Shiro的Web過濾器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  <property name="securityManager" ref="securityManager"/>
  <property name="loginUrl" value="/login.jsp"/>
  <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
  <property name="filters">
    <util:map>
      <entry key="authc" value-ref="formAuthenticationFilter"/>
    </util:map>
  </property>
  <property name="filterChainDefinitions">
    <value>
      /index.jsp = anon
      /unauthorized.jsp = anon
      /login.jsp = authc
      /logout = logout
      /** = user
    </value>
  </property>
</bean>

1、formAuthenticationFilter為基于Form表單的身份驗證過濾器;此處可以再添加自己的Filter bean定義;

2、shiroFilter:此處使用ShiroFilterFactoryBean來創建ShiroFilter過濾器;filters屬性用于定義自己的過濾器,即ini配置中的[filters]部分;filterChainDefinitions用于聲明url和filter的關系,即ini配置中的[urls]部分。 

接著需要在web.xml中進行如下配置: 

?
1
2
3
4
5
6
7
8
9
10
11
12
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    classpath:spring-beans.xml,
    classpath:spring-shiro-web.xml
  </param-value>
</context-param>
<listener>
  <listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

通過ContextLoaderListener加載contextConfigLocation指定的Spring配置文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
<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>/*</url-pattern>
</filter-mapping>

 DelegatingFilterProxy會自動到Spring容器中查找名字為shiroFilter的bean并把filter請求交給它處理。

Shiro權限注解

Shiro提供了相應的注解用于權限控制,如果使用這些注解就需要使用AOP的功能來進行判斷,如Spring AOP;Shiro提供了Spring AOP集成用于權限注解的解析和驗證。

為了測試,此處使用了Spring MVC來測試Shiro注解,當然Shiro注解不僅僅可以在web環境使用,在獨立的JavaSE中也是可以用的,此處只是以web為例了。 

在spring-mvc.xml配置文件添加Shiro Spring AOP權限注解的支持:   

?
1
2
3
4
5
<aop:config proxy-target-class="true"></aop:config>
<bean class="
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  <property name="securityManager" ref="securityManager"/>
</bean>

如上配置用于開啟Shiro Spring AOP權限注解的支持;<aop:config proxy-target-class="true">表示代理類。

接著就可以在相應的控制器(AnnotationController)中使用如下方式進行注解: 

?
1
2
3
4
5
@RequiresRoles("admin")
@RequestMapping("/hello2")
public String hello2() {
  return "success";
}

訪問hello2方法的前提是當前用戶有admin角色。 

當驗證失敗,其會拋出UnauthorizedException異常,此時可以使用Spring的ExceptionHandler(DefaultExceptionHandler)來進行攔截處理:

?
1
2
3
4
5
6
7
8
@ExceptionHandler({UnauthorizedException.class})
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public ModelAndView processUnauthenticatedException(NativeWebRequest request, UnauthorizedException e) {
  ModelAndView mv = new ModelAndView();
  mv.addObject("exception", e);
  mv.setViewName("unauthorized");
  return mv;
}

 權限注解      

@RequiresAuthentication  

表示當前Subject已經通過login進行了身份驗證;即Subject. isAuthenticated()返回true。 

@RequiresUser  

表示當前Subject已經身份驗證或者通過記住我登錄的。

@RequiresGuest  

表示當前Subject沒有身份驗證或通過記住我登錄過,即是游客身份。  

@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)  

表示當前Subject需要角色admin和user。 

@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR)  

表示當前Subject需要權限user:a或user:b。

總結

以上所述是小編給大家介紹的詳解spring與shiro集成,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wwpd.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一级在线观看视频 | 亚洲精品色婷婷在线影院麻豆 | 久久综合网久久综合 | 思思91精品国产综合在线 | 99在线视频精品费观看视 | 免费看黄色片网站 | 无码人妻精品一区二区蜜桃在线看 | 亚洲www在线 | 亚洲高清视频在线 | 99在线精品日韩一区免费国产 | japonensis日本护士 | 男人天堂a| 精品国产一二三区在线影院 | 手机免费在线视频 | 韩国三级做爰 | 国产91精品在线观看 | 四虎永久免费在线观看 | 99精品免费视频 | 日本视频一区在线观看免费 | 我的年轻漂亮继坶三级 | 五月天色小说 | 91一区二区在线观看精品 | 91影视在线看免费观看 | 精品九九视频 | 久久性生大片免费观看性 | 亚洲大片免费观看 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 午夜国产精品福利在线观看 | 无码一区国产欧美在线资源 | 欧美日韩国产精品综合 | 第一国内永久免费福利视频 | 天天综合天天影视色香欲俱全 | 国产玖玖在线观看 | 人人爽人人射 | 日本福利网 | 三级aaa黄特色 | 精品日本三级在线观看视频 | 2019韩国最新三级 | yjzz视频 | 亚洲精品一区二区久久这里 | 春色视频网站 |