日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring集成Shiro框架实战

發(fā)布時(shí)間:2025/3/19 javascript 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring集成Shiro框架实战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一:什么是Shiro框架
  • 二:Shiro框架簡(jiǎn)介
    • 1、Shiro基礎(chǔ)功能點(diǎn)介紹
    • 2、Shiro的工作原理
    • 3、Shiro的內(nèi)部工作結(jié)構(gòu)
    • 4、Shiro的身份認(rèn)證流程
  • 三:Spring集成Shrio
    • 1、添加依賴支持
    • 2、首先添加ShrioFilter攔截器
    • 3、定義一個(gè)myspring-shiro.xml的權(quán)限配置文件
    • 4、將myspring-shiro.xml添加到applicationContext.xml
    • 5、編寫MyShiroRealm
    • 6、編寫登錄模塊代碼
  • 四:總結(jié)

一:什么是Shiro框架

Shiro是一個(gè)輕量級(jí)的權(quán)限框架,它可以幫助我們完成:認(rèn)證、授權(quán)、會(huì)話管理、與Web繼承、緩存等功能。它有以下幾個(gè)特點(diǎn):

  • 易于使用 :易于使用是該項(xiàng)目的最終目標(biāo)。
  • 全面 :Apache Shiro聲稱沒(méi)有其他具有范圍廣度的安全框架,因此它可能是滿足安全需求的“一站式服務(wù)”。
  • 靈活 :Apache Shiro可以在任何應(yīng)用程序環(huán)境中工作。雖然它可以在Web,EJB和IoC環(huán)境中運(yùn)行,但不需要它們。Shiro也不要求任何規(guī)范,甚至沒(méi)有很多依賴性。
  • 具有Web功能 :Apache Shiro具有出色的Web應(yīng)用程序支持,使您可以基于應(yīng)用程序URL和Web協(xié)議(例如REST)創(chuàng)建靈活的安全策略,同時(shí)還提供一組JSP庫(kù)來(lái)控制頁(yè)面輸出。
  • 可插拔 :Shiro干凈的API和設(shè)計(jì)模式使它易于與許多其他框架和應(yīng)用程序集成。您會(huì)看到Shiro與Spring,Grails,Wicket,Tapestry,Mule,Apache Camel,Vaadin等框架無(wú)縫集成。
  • 受支持 :Apache Shiro是Apache Software Foundation(Apache軟件基金會(huì))的一部分,事實(shí)證明該組織的運(yùn)作符合其社區(qū)的最大利益。項(xiàng)目開發(fā)和用戶群體友好的公民隨時(shí)可以提供幫助。如果需要,像Katasoft這樣的商業(yè)公司也可以提供專業(yè)的支持和服務(wù)。

Apache Shiro官網(wǎng):https://www.infoq.com/articles/apache-shiro/

二:Shiro框架簡(jiǎn)介

1、Shiro基礎(chǔ)功能點(diǎn)介紹


Shiro框架的四個(gè)基石:身份驗(yàn)證、授權(quán)、會(huì)話管理、密碼模塊
Authentication:身份認(rèn)證/登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份;
Authorization:授權(quán),即權(quán)限驗(yàn)證,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限;即判斷用戶是否能做事情,常見(jiàn)的如:驗(yàn)證某個(gè)用戶是否擁有某個(gè)角色。或者細(xì)粒度的驗(yàn)證某個(gè)用戶對(duì)某個(gè)資源是否具有某個(gè)權(quán)限;
Session Management:會(huì)話管理,即用戶登錄后就是一次會(huì)話,在沒(méi)有退出之前,它的所有信息都在會(huì)話中,會(huì)話可以是普通的JavaSE環(huán)境,也可以是Web環(huán)境的;
Cryptography:密碼模塊,加密保護(hù)數(shù)據(jù)的安全性,如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù)中,而非明文存儲(chǔ);

在不同的應(yīng)用程序環(huán)境中,還具有其他功能來(lái)支持和加強(qiáng)這些問(wèn)題,尤其是:
Web Support:Web支持,可以非常容易的集成到Web環(huán)境
Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率;
Concurrency:Shiro支持多線程應(yīng)用的并發(fā)驗(yàn)證,即使在一個(gè)先程中開啟另一個(gè)線程,也可以把權(quán)限自動(dòng)傳播過(guò)去;
Testing:提供測(cè)試支持;
“RunAs”:允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問(wèn);
Remember Me:記住我,這個(gè)是非常常見(jiàn)的功能,即一次登錄后,下次再來(lái)的話不用登錄了。

需要注意,Shiro 不會(huì)去維護(hù)用戶、維護(hù)權(quán)限;這些需要我們自己去設(shè)計(jì) / 提供;然后通過(guò)相應(yīng)的接口注入給 Shiro 即可。

2、Shiro的工作原理


從應(yīng)用的視角我們可以看到應(yīng)用層直接交互的對(duì)象就是Subject,Shiro對(duì)外API核心就是Subject,如下介紹每個(gè)API的含義:

Subject:主體,代表了當(dāng)前“用戶”,這個(gè)用戶不一定是一個(gè)具體的人,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)絡(luò)爬蟲,機(jī)器人等;即一個(gè)抽象的概念;所有的Subject都綁定到SecurityManager,與Subject的所有交互都會(huì)委托給SecurityManager;可以把Sub認(rèn)為是一個(gè)門面;SecManager才是實(shí)際的執(zhí)行者;

SecurityManager:安全管理器;即所有與安全有關(guān)的操作都會(huì)與SecurityManager交互;并且它管理著所有的Subject,它是Shiro的核心,它負(fù)責(zé)與后面的其他組件進(jìn)行交互,它類似SpringMVC里面的DispatcherServlet前端控制器;

Realm:域,Shiro從Realm獲取安全數(shù)據(jù)(用戶、角色、權(quán)限),SecurityManager需要驗(yàn)證用戶身份,那么它需要從Ream獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法;也需要從Ream得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗(yàn)證用戶是否能進(jìn)行操作;可以把Realm看成DataSource,即數(shù)據(jù)源;

一個(gè)簡(jiǎn)單的Shiro應(yīng)用流程如下:
1、應(yīng)用代碼通過(guò)Subject來(lái)進(jìn)行認(rèn)證和授權(quán),而Subject又委托給SecurityManager;
2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能夠得到合法的用戶及其權(quán)限進(jìn)行判斷。

3、Shiro的內(nèi)部工作結(jié)構(gòu)


Subject:主體,可以看到主體可以是任何可以與應(yīng)用交互的 “用戶”;

SecurityManager:相當(dāng)于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher;是 Shiro 的心臟;所有具體的交互都通過(guò) SecurityManager 進(jìn)行控制;它管理著所有 Subject、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會(huì)話、緩存的管理。

Authenticator:認(rèn)證器,負(fù)責(zé)主體認(rèn)證的,這是一個(gè)擴(kuò)展點(diǎn),如果用戶覺(jué)得 Shiro 默認(rèn)的不好,可以自定義實(shí)現(xiàn);其需要認(rèn)證策略(Authentication Strategy),即什么情況下算用戶認(rèn)證通過(guò)了;

Authrizer:授權(quán)器,或者訪問(wèn)控制器,用來(lái)決定主體是否有權(quán)限進(jìn)行相應(yīng)的操作;即控制著用戶能訪問(wèn)應(yīng)用中的哪些功能;

Realm:可以有 1 個(gè)或多個(gè) Realm,可以認(rèn)為是安全實(shí)體數(shù)據(jù)源,即用于獲取安全實(shí)體的;可以是 JDBC 實(shí)現(xiàn),也可以是 LDAP 實(shí)現(xiàn),或者內(nèi)存實(shí)現(xiàn)等等;由用戶提供;注意:Shiro 不知道你的用戶 / 權(quán)限存儲(chǔ)在哪及以何種格式存儲(chǔ);所以我們一般在應(yīng)用中都需要實(shí)現(xiàn)自己的 Realm;

SessionManager:如果寫過(guò) Servlet 就應(yīng)該知道 Session 的概念,Session 呢需要有人去管理它的生命周期,這個(gè)組件就是 SessionManager;而 Shiro 并不僅僅可以用在 Web 環(huán)境,也可以用在如普通的 JavaSE 環(huán)境、EJB 等環(huán)境;所以呢,Shiro 就抽象了一個(gè)自己的 Session 來(lái)管理主體與應(yīng)用之間交互的數(shù)據(jù);這樣的話,比如我們?cè)?Web 環(huán)境用,剛開始是一臺(tái) Web 服務(wù)器;接著又上了臺(tái) EJB 服務(wù)器;這時(shí)想把兩臺(tái)服務(wù)器的會(huì)話數(shù)據(jù)放到一個(gè)地方,這個(gè)時(shí)候就可以實(shí)現(xiàn)自己的分布式會(huì)話(如把數(shù)據(jù)放到 Memcached 服務(wù)器);

SessionDAO:DAO 大家都用過(guò),數(shù)據(jù)訪問(wèn)對(duì)象,用于會(huì)話的 CRUD,比如我們想把 Session 保存到數(shù)據(jù)庫(kù),那么可以實(shí)現(xiàn)自己的 SessionDAO,通過(guò)如 JDBC 寫到數(shù)據(jù)庫(kù);比如想把 Session 放到 Memcached 中,可以實(shí)現(xiàn)自己的 Memcached SessionDAO;另外 SessionDAO 中可以使用 Cache 進(jìn)行緩存,以提高性能;

CacheManager:緩存控制器,來(lái)管理如用戶、角色、權(quán)限等的緩存的;因?yàn)檫@些數(shù)據(jù)基本上很少去改變,放到緩存中后可以提高訪問(wèn)的性能

Cryptography:密碼模塊,Shiro 提高了一些常見(jiàn)的加密組件用于如密碼加密 / 解密的。

4、Shiro的身份認(rèn)證流程


流程如下:

  • 首先調(diào)用 Subject.login(token) 進(jìn)行登錄,其會(huì)自動(dòng)委托給 Security Manager,調(diào)用之前必須通過(guò) SecurityUtils.setSecurityManager() 設(shè)置;
  • SecurityManager 負(fù)責(zé)真正的身份驗(yàn)證邏輯;它會(huì)委托給 Authenticator 進(jìn)行身份驗(yàn)證;
  • Authenticator 才是真正的身份驗(yàn)證者,Shiro API 中核心的身份認(rèn)證入口點(diǎn),此處可以自定義插入自己的實(shí)現(xiàn);
  • Authenticator 可能會(huì)委托給相應(yīng)的 AuthenticationStrategy 進(jìn)行多 Realm 身份驗(yàn)證,默認(rèn) ModularRealmAuthenticator 會(huì)調(diào)用AuthenticationStrategy 進(jìn)行多 Realm 身份驗(yàn)證;
  • Authenticator 會(huì)把相應(yīng)的 token 傳入 Realm,從 Realm 獲取身份驗(yàn)證信息,如果沒(méi)有返回 / 拋出異常表示身份驗(yàn)證失敗了。此處可以配置多個(gè) Realm,將按照相應(yīng)的順序及策略進(jìn)行訪問(wèn)
  • 三:Spring集成Shrio

    1、添加依賴支持

    本文使用的shiro版本為:1.2.2

    <shiro.version>1.2.2</shiro.version> <!--shiro start--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-quartz</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><!--shiro end-->

    2、首先添加ShrioFilter攔截器

    <filter><description>shiro 權(quán)限攔截</description><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>

    3、定義一個(gè)myspring-shiro.xml的權(quán)限配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"><description> shiro 配置</description><!--1,配置SecurityManager--><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="MyShiroRealm"></property></bean><!--2.配置cacheManager--><bean class="org.apache.shiro.cache.MemoryConstrainedCacheManager"/><!--3.配置authenticator--><bean class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"><property name="authenticationStrategy"><bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy"></bean></property></bean><!--4.配置realm --><bean id ="MyShiroRealm" class="com.leo.shiro.MyShiroRealm"><property name="credentialsMatcher"><bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"><property name="hashAlgorithmName" value="MD5"></property><property name="hashIterations" value="1024"></property></bean></property></bean><!--5.配置lifecycleBeanPostProcessor 可以自動(dòng)的來(lái)調(diào)用配置在Spring IOC 容器中的生命周期方法--><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean><!--6.啟動(dòng)IOC容器中使用shiro 的注解,但必須配置lifecycleBeanPostProcessor 之后,才能使用--><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"></bean><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager"></property></bean><!--配置shiroFilter--><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"></property><property name="loginUrl" value="/login.jsp"></property><!--這里直接用Controller里面跳轉(zhuǎn)到成功界面,所以沒(méi)設(shè)置參數(shù)--><property name="successUrl" value="/index.jsp"></property><property name="unauthorizedUrl" value="/view"></property><!-- 配置哪些頁(yè)面需要受保護(hù). 以及訪問(wèn)這些頁(yè)面需要的權(quán)限.1). anon(anonymous) 可以被匿名訪問(wèn) 2). authc(authentication)必須認(rèn)證(即登錄)后才可能訪問(wèn)的頁(yè)面. 3). logout 登出.4)等等其他的,沒(méi)用到 我就不寫出來(lái)了 --><property name="filterChainDefinitions"><value>/login.jsp=anon/user/login=anon/hello=anon#表示其他所有的url都需要認(rèn)證/** =authc</value></property></bean> </beans>

    4、將myspring-shiro.xml添加到applicationContext.xml

    <!-- 引入shiro配置信息 --><import resource="myspringmvc-shiro.xml"/>

    5、編寫MyShiroRealm

    package com.leo.shiro;import com.leo.model.User; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource;import java.util.*;/*** @ClassName: MyShiroRealm* @Description: shiro的授權(quán)鑒權(quán)* @Author: leo825* @Date: 2020-08-01 11:16* @Version: 1.0**/ public class MyShiroRealm extends AuthorizingRealm {private static Map<String,User> userMap = new HashMap<String, User>();static{ // userMap.put("jack", new User("jack","aaa123")); // userMap.put("tom", new User("tom","bbb321")); // userMap.put("jean", new User("jean","ccc213"));//使用Map模擬數(shù)據(jù)庫(kù)獲取User表信息userMap.put("jack", new User("jack","43e66616f8730a08e4bf1663301327b1"));userMap.put("tom", new User("tom","3abee8ced79e15b9b7ddd43b95f02f95"));userMap.put("jean", new User("jean","1a287acb0d87baded1e79f4b4c0d4f3e"));}/**** 授權(quán)* @param* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {Object principal = principals.getPrimaryPrincipal();Set<String> roles = new HashSet<>();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();if ("admin".equals(principal.toString())) {roles.add("admin");info.setRoles(roles);info.addStringPermissions(Arrays.asList("admin:*"));} else if ("user".equals(principal.toString())) {roles.add("user");info.setRoles(roles);info.addStringPermissions(Arrays.asList("user:*"));}return info;}/***** 認(rèn)證* @param token* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//1.把AuthenticationToken轉(zhuǎn)換為UsernamePasswordTokenUsernamePasswordToken userToken = (UsernamePasswordToken) token;//2.從UsernamePasswordToken中獲取usernameString username = userToken.getUsername();//3.調(diào)用數(shù)據(jù)庫(kù)的方法,從數(shù)據(jù)庫(kù)中查詢Username對(duì)應(yīng)的用戶記錄System.out.println("從數(shù)據(jù)看中獲取UserName為"+username+"所對(duì)應(yīng)的信息。");//Map模擬數(shù)據(jù)庫(kù)取數(shù)據(jù)User u = userMap.get(username);//4.若用戶不行存在,可以拋出UnknownAccountExceptionif(u==null){throw new UnknownAccountException("用戶不存在");}//5.若用戶被鎖定,可以拋出LockedAccountException // if(u.isLocked()){ // throw new LockedAccountException("用戶被鎖定"); // }//7.根據(jù)用戶的情況,來(lái)構(gòu)建AuthenticationInfo對(duì)象,通常使用的實(shí)現(xiàn)類為SimpleAuthenticationInfo//以下信息是從數(shù)據(jù)庫(kù)中獲取的//1)principal:認(rèn)證的實(shí)體信息,可以是username,也可以是數(shù)據(jù)庫(kù)表對(duì)應(yīng)的用戶的實(shí)體對(duì)象Object principal = u.getUserName();//2)credentials:密碼Object credentials = u.getPassword();//3)realmName:當(dāng)前realm對(duì)象的name,調(diào)用父類的getName()方法即可String realmName = getName();//4)credentialsSalt鹽值ByteSource credentialsSalt = ByteSource.Util.bytes(principal);//使用賬號(hào)作為鹽值SimpleAuthenticationInfo info = null; //new SimpleAuthenticationInfo(principal,credentials,realmName);info = new SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName);return info;}// //main方法生成加密后的密碼 // public static void main(String[] args) { // User u = null; // Iterator<String> it = userMap.keySet().iterator(); // while(it.hasNext()){ // u = userMap.get(it.next()); // String hashAlgorithmName = "MD5";//加密方式 // Object crdentials = u.getPassword();//密碼原值 // ByteSource salt = ByteSource.Util.bytes(u.getUserName());//以賬號(hào)作為鹽值 // int hashIterations = 1024;//加密1024次 // Object result = new SimpleHash(hashAlgorithmName,crdentials,salt,hashIterations); // System.out.println(u.getUserName()+":"+result); // } // } }

    6、編寫登錄模塊代碼

    package com.leo.controller;import com.leo.model.User; import com.leo.service.UserService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @ClassName: LoginController* @Description: 登錄認(rèn)證控制器* @Author: leo825* @Date: 2020-08-01 11:58* @Version: 1.0**/@Controller @RequestMapping("/user") public class LoginController {@Autowiredprivate UserService userService;@RequestMapping("/login")public String dologin(User user, Model model){System.out.println("登錄認(rèn)證開始了...");String info = loginUser(user);if (!"SUCC".equals(info)) {model.addAttribute("failMsg", "用戶不存在或密碼錯(cuò)誤!");//此處不能展示具體失敗信息,會(huì)遭到安全攻擊return "/jsp/fail";}else{model.addAttribute("successMsg", "登陸成功!");//返回到頁(yè)面說(shuō)夾帶的參數(shù)model.addAttribute("name", user.getUserName());return "/jsp/success";//返回的頁(yè)面}}@RequestMapping("/logout")public void logout(HttpServletRequest request,HttpServletResponse response) throws IOException{Subject subject = SecurityUtils.getSubject();if (subject != null) {try{subject.logout();}catch(Exception ex){}}response.sendRedirect("/login.jsp");}private String loginUser(User user) {if (isRelogin(user)) return "SUCC"; // 如果已經(jīng)登陸,無(wú)需重新登錄return shiroLogin(user); // 調(diào)用shiro的登陸驗(yàn)證}/*** 登錄驗(yàn)證* @param user* @return*/private String shiroLogin(User user) {// 組裝token:用戶名稱、密碼UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(), user.getPassword().toCharArray(), null);token.setRememberMe(true);// shiro登陸驗(yàn)證try {SecurityUtils.getSubject().login(token);} catch (UnknownAccountException ex) {return "用戶不存在或者密碼錯(cuò)誤!";} catch (IncorrectCredentialsException ex) {return "用戶不存在或者密碼錯(cuò)誤!";} catch (AuthenticationException ex) {ex.printStackTrace();return ex.getMessage(); // 自定義報(bào)錯(cuò)信息} catch (Exception ex) {ex.printStackTrace();return "內(nèi)部錯(cuò)誤,請(qǐng)重試!";}return "SUCC";}/*** 檢測(cè)是否需要重新登錄* @param user* @return*/private boolean isRelogin(User user) {Subject us = SecurityUtils.getSubject();if (us.isAuthenticated()) {return true; // 參數(shù)未改變,無(wú)需重新登錄,默認(rèn)為已經(jīng)登錄成功}return false; // 需要重新登陸} }

    登錄頁(yè)面和登錄成功失敗的頁(yè)面就省略了

    四:總結(jié)

    根據(jù)此篇文章可以基本了解什么是Shiro,Shiro能做些什么,以及如何在SpringMVC中整合Shrio。
    源碼模塊:chapter-7-springmvc-shiro1
    地址:https://gitee.com/leo825/spring-framework-learning-example.git

    總結(jié)

    以上是生活随笔為你收集整理的Spring集成Shiro框架实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。